Wie führe ich einen sudo-Befehl aus, für den im Hintergrund ein Kennwort eingegeben werden muss?


29

Ich habe kürzlich sudodie Authentifizierungs-Caching-Funktion deaktiviert , sodass ich jetzt jedes Mal zur Eingabe eines Kennworts aufgefordert werde.

Und obwohl dies gut für die Sicherheit ist, hat es ein kleines Problem verursacht, für das ich keine Lösung finden konnte. Ich kann keine Befehle ausführen, die wie folgt lauten:

sudo <command> &

In der Vergangenheit hätte ich vorher einen sudoBefehl ausgeführt, mein Kennwort zwischengespeichert und es mir ermöglicht, sudoBefehle ohne Eingabeaufforderung für die nächsten Minuten auszuführen, sodass ich den Befehl ausführen konnte.
Aber wenn ich es jetzt ausführe, weil es kein Caching gibt und weil es sofort einen neuen Thread startet und sudomich nicht einmal zur Eingabe eines Passworts auffordert, kann ich es nicht auf diese Weise ausführen.

Wenn ich es nicht sudo -ivorher ausführe, kann ich keinen Befehl in diesem Format ausführen, was ziemlich nervig wird.
Also habe ich mich gefragt, ob es eine Möglichkeit gibt, dies zu umgehen und trotzdem Programme und Befehle auf diese Weise auszuführen?

Ich verwende Ubuntu GNOME 15.10 mit GNOME 3.18 und speziell das Programm, das ich auf diese Weise ausführen möchte, ist, etherapeob dies einen Unterschied macht, aber ich möchte wirklich, dass die Lösung für alle Programme und Befehle funktioniert.


3
@kossince &ist nicht wirklich durchsuchbar, ich ändere das auf … sudo command in the background.
Muru

@muru Wenn Sie beliebte Suchmaschinen dazu bringen können, stattdessen nach Sonderzeichen zu suchen. : P
kos

1

Antworten:


56

sudoSagen Sie sudo, dass der Befehl nicht im Hintergrund ausgeführt werden soll, sondern im Hintergrund. Von 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.

Beispielsweise:

sudo -b sleep 10

Eine andere Möglichkeit wäre, einfach eine Shell zu verwenden, um den Befehl auszuführen:

sudo sh -c 'sleep 10 &'

Eine andere Möglichkeit wäre, ein grafisches Programm zum Abrufen des Passworts anzugeben und es sudotrotzdem in den Hintergrund zu senden :

-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.

Askpass-Programme werden normalerweise für SSH verwendet. Ein solches wird durch das ssh-askpass-gnomePaket bereitgestellt, das standardmäßig mindestens unter Ubuntu 15.10 installiert ist.

SUDO_ASKPASS=/usr/bin/ssh-askpass sudo -A sleep 10 &

11

Wenn Sie bereit sind, timestamp_timeoutmindestens eine Einstellung wie 0.02(1,2 Sekunden, ich würde sagen, genauso sicher wie 0) in /etc/sudoers(in Ihrem Fall erforderlich, aber mit den Standardeinstellungen oder mit einer timestamp_timeoutEinstellung auf etwas anderes, 0kann man einfach Folgendes tun) , Sie können einen Alias ​​wie diesen eingeben ~/.bashrc, bei dem Sie nicht daran denken müssen, etwas zu tun, bevor Sie den Befehl ausführen, und der es Ihnen ermöglicht, die Kontrolle über den Prozess zu behalten .:

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

Der Trick hier ist das Semikolon, mit dem Bash sudo -vzuerst und separat analysiert wird , um den Benutzer zu authentifizieren, und der potenzielle Hintergrundteil auf den [ $? ] && sudoBefehl beschränkt wird, der prüft, ob der Befehl sudo -verfolgreich war, und ihn sudoerneut ausführt (möglicherweise im Hintergrund), falls dies der Fall ist.

$ alias sudo='sudo -v; [ $? ] && sudo'
$ sudo -H gedit &
[sudo] password for user:
[1] 19966
$ jobs
[1]+  Running                 [ $? ] && sudo -H gedit &

Hat sudo -verweitern Credential - Caching auch wenn Caching deaktiviert ist? Und, IIRC <damit Aliase erweitert werden, sollte der Speicherplatz am Ende des Befehls und nicht am Anfang sein.
muru

@muru RIght ich vergaß er timestamp_timeoutauf 0. Und ja, ich habe die Alias-Erweiterungssache komplett durcheinander gebracht, eigentlich sollte der Alias nicht erweitert werden. Vielen Dank.
Kos

Wäre das nicht alias sudo='sudo -v && sudo'so gut?
G-Man sagt, dass Monica am

@ G-Man Nein, das funktioniert, weil das ;Bash sudo -vzuerst und separat parsen lässt ; Wenn Sie &&Bash verwenden, werden beide Befehle sofort als ein einziger Befehl und der Hintergrund sofort analysiert.
Kos

8

Das kannst du nicht. Der &schickt den Befehl sofort in den Hintergrund. Das heißt, im Hintergrund wird eine Subshell erstellt und der Befehl dort ausgeführt. Wenn dieser Befehl eine Eingabeaufforderung ausgibt, wie es der Fall ist sudo, wird die Eingabeaufforderung im Hintergrund angezeigt und Sie sehen sie nie.

Die einzige Möglichkeit, dies zu umgehen, besteht darin, den Befehl wieder in den Vordergrund zu stellen, das Kennwort anzugeben und es wieder in den Hintergrund zu stellen. Beispielsweise:

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

Geben Sie nun Ihr Passwort ein, drücken Sie Enterund dann CtrlZ, um es wieder in den Hintergrund zu stellen und ihm bgmitzuteilen, dass es weiter ausgeführt werden soll.

Ein einfacherer Ansatz wäre &, Jobs nie zu verwenden und stattdessen manuell mit CtrlZund bgnach dem Start an den Hintergrund zu senden .

Schließlich können Sie das Kennwort-Timeout von sudo auf 1 oder 2 Sekunden einstellen. Das gibt Ihnen immer noch genügend Sicherheit (es sei denn, Sie versuchen, sich vor dem Flash zu schützen) und ermöglicht es Ihnen, Befehle wie diese wie erwartet auszuführen.


Der Blitz hat meinen Schokoladenkuchen so gestohlen ... ; P

2
In Zeiten von Adobe-Sicherheitslücken und Malware, die die Firmware infizieren, ist Vorsicht vor Flash geboten.
Damian Yerrick

1
@DamianYerrick de.wikipedia.org/wiki/Flash_(Barry_Allen )
terdon

Ist es tatsächlich möglich, das Timeout auf Sekunden zu setzen? man sudoerssagt timestamp_timeout, der Wert soll Minuten mit einem möglichen Bruchteil angeben (was übrigens sudoFehler macht , wenn ich versuche, einen anzugeben, nicht sicher warum).
Kos

2
@kos hört sich ja so an. 2.5Funktioniert hier sudoeinwandfrei (Arch, Version 1.8.15).
Terdon
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.