Jak uruchomić polecenie sudo wymagające wprowadzenia hasła w tle?

29

Niedawno wyłączyłem funkcję sudobuforowania uwierzytelniania, aby teraz za każdym razem monitował mnie o hasło.

I chociaż jest to dobre dla bezpieczeństwa, spowodowało jeden niewielki problem, dla którego nie byłem w stanie znaleźć rozwiązania, nie jestem w stanie uruchamiać poleceń zgodnych z:

sudo <command> &

W przeszłości uruchamiałem sudowcześniej polecenie, buforowałoby moje hasło i pozwalało mi na uruchamianie sudopoleceń bez monitowania przez kilka następnych minut, a zatem pozwalało mi na uruchamianie polecenia.
Ale kiedy uruchomię go teraz, ponieważ nie ma wcześniej buforowania, a ponieważ natychmiast rozpoczyna on nowy wątek i sudonawet nie monituje o hasło, nie jestem w stanie uruchomić go w ten sposób.

Więc dopóki nie ucieknę sudo -i go wcześniej, nie będę mógł uruchomić polecenia w tym formacie, co staje się dość denerwujące.
Zastanawiałem się więc, czy jest jakiś sposób na obejście tego i nadal uruchamianie programów i poleceń w ten sposób?

Używam Ubuntu GNOME 15.10 z GNOME 3.18, a konkretnie program, który chcę uruchamiać w ten sposób, to etherapeczy to robi jakąkolwiek różnicę, ale naprawdę chciałbym, aby rozwiązanie działało dla wszystkich programów i poleceń.

muru
źródło
3
@kossince &nie da się przeszukiwać, zmieniam to na … sudo command in the background.
muru
@muru Jeśli możesz zmusić popularne wyszukiwarki do wyszukiwania znaków specjalnych zamiast. : P
kos
1
@kos będziesz zaskoczony . : D
muru

Odpowiedzi:

56

Zamiast uruchamiać się sudow tle, powiedz, sudoaby uruchomić polecenie w tle. Od man sudo:

-b, --background
     Run the given command in the background.  Note that it is not
     possible to use shell job control to manipulate background
     processes started by sudo.  Most interactive commands will
     fail to work properly in background mode.

Na przykład:

sudo -b sleep 10

Innym sposobem byłoby po prostu użycie powłoki do uruchomienia polecenia:

sudo sh -c 'sleep 10 &'

Inną opcją byłoby określenie programu graficznego do uzyskiwania hasła i wysłanie sudogo mimo to do tła:

-A, --askpass
     Normally, if sudo requires a password, it will read it from
     the user's terminal.  If the -A (askpass) option is
     specified, a (possibly graphical) helper program is executed
     to read the user's password and output the password to the
     standard output.  If the SUDO_ASKPASS environment variable is
     set, it specifies the path to the helper program.  Otherwise,
     if sudo.conf(5) contains a line specifying the askpass
     program, that value will be used.  For example:

         # Path to askpass helper program
         Path askpass /usr/X11R6/bin/ssh-askpass

     If no askpass program is available, sudo will exit with an
     error.

Programy SSH są zwykle używane w SSH. Jednym z nich jest ssh-askpass-gnomepakiet, który jest instalowany domyślnie, przynajmniej na Ubuntu 15.10.

SUDO_ASKPASS=/usr/bin/ssh-askpass sudo -A sleep 10 &
muru
źródło
11

Jeśli chcesz ustawić timestamp_timeoutprzynajmniej coś takiego 0.02(1,2 sekundy, powiedziałbym, że jest równie bezpieczny jak 0) w /etc/sudoers(potrzebne w twoim przypadku, ale z ustawieniami domyślnymi lub z timestamp_timeoutustawieniem na cokolwiek innego niż 0tylko można wykonać następujące czynności) , możesz ustawić alias taki jak ten ~/.bashrc, który nie będzie wymagał, aby pamiętać o zrobieniu czegoś przed uruchomieniem polecenia, i który pozwoli ci zachować kontrolę nad procesem:

alias sudo='sudo -v; [ $? ] && sudo'

Sztuką jest średnik, który sprawi, że Bash parsuje sudo -vnajpierw i osobno, uwierzytelniając użytkownika, i ogranicza potencjalną część tła do [ $? ] && sudopolecenia, które sprawdzi, czy się sudo -vpowiodło, i uruchomi sudoponownie (potencjalnie w tle), gdyby tak było.

$ alias sudo='sudo -v; [ $? ] && sudo'
$ sudo -H gedit &
[sudo] password for user:
[1] 19966
$ jobs
[1]+  Running                 [ $? ] && sudo -H gedit &
kos
źródło
Czy sudo -vrozszerza buforowanie poświadczeń, nawet jeśli buforowanie jest wyłączone? I, IIRC <dla aliasów do rozszerzenia, przestrzeń powinna znajdować się na końcu polecenia, a nie na początku.
muru
@muru RIght Zapomniałem, że się timestamp_timeoutustawił 0. I tak, całkowicie zawiodłem w kwestii rozszerzenia aliasu, alias nie powinien się rozwijać. Dzięki.
Kos
Nie alias sudo='sudo -v && sudo'byłoby tak dobrze?
G-Man mówi „Przywróć Monikę”
@ G-Man Nie, to działa, ponieważ ;sprawia, że ​​Bash parsuje sudo -vnajpierw i osobno; użycie &&Bash parsowałoby je zarówno jako pojedyncze polecenie, jak i działało w tle natychmiast.
Kos
8

Nie możesz &Natychmiast wysyła polecenia do tła. Oznacza to, że w tle tworzona jest podpowłoka i tam wykonywana jest komenda. Gdy to polecenie wydaje monit, jak w przypadkusudo , monit jest wyświetlany w tle i nigdy go nie widzisz.

Jedynym sposobem jest przeniesienie polecenia z powrotem na pierwszy plan, podanie hasła i odesłanie go w tło. Na przykład:

$ sudo command &
$ fg
sudo command
[sudo] password for terdon: 

Teraz wprowadź hasło, naciśnij, Entera następnie naciśnij, CtrlZaby odesłać je z powrotem do tła i bgpowiedzieć mu, aby kontynuowało działanie.

Prostszym podejściem byłoby nigdy nie używać, &a zamiast tego wysyłać zadania do tła ręcznie za ich pomocą CtrlZi bgpo ich uruchomieniu.

Na koniec warto rozważyć ustawienie limitu czasu hasła sudo na około 1 lub 2 sekundy. To wciąż zapewniłoby ci wystarczające bezpieczeństwo (chyba, że ​​próbujesz się chronić przed Flashem) i pozwoliło ci uruchamiać takie polecenia zgodnie z oczekiwaniami.

terdon
źródło
Flash kradnie moje ciasto czekoladowe, więc ... ; P
2
W tej erze podatności Adobe i złośliwego oprogramowania, które infekuje oprogramowanie wewnętrzne, należy uważać na Flash.
Damian Yerrick
Na marginesie, czy rzeczywiście można ustawić limit czasu na sekundy? man sudoersmówi timestamp_timeout, że wartość powinna określać minuty z możliwą częścią ułamkową (która, nawiasem mówiąc, powoduje sudobłąd, jeśli próbuję podać jedną, nie wiem dlaczego).
Kos
2
@kos brzmi tak. 2.5działa tutaj dobrze (Arch, sudowersja 1.8.15).
terdon