2009-11-09 02:37:00 +0000 2009-11-09 02:37:00 +0000
123
123

sudo mit Passwort in einer Befehlszeile?

An arbeitsreichen Tagen würde ich gerne

$ ./configure && make && sudo make install && halt

in der Nacht laufen lassen und zu Bett gehen, in der Hoffnung, dass die Anwendung automatisch installiert wird. Aber was ich am nächsten Tag sehe, ist der Bildschirm, auf dem mich sudo nach dem Passwort fragt. Wie könnte ich also sudo mit Passwort in einer Befehlszeile ausführen, oder gibt es eine andere Methode, dies zu tun?

Antworten (11)

185
185
185
2009-11-09 02:47:20 +0000

Ja, verwenden Sie den Schalter -S, der das Kennwort von STDIN liest:

$echo <password> | sudo -S <command>

Also für Ihren Fall würde es so aussehen:

$./configure && make && echo <password> | sudo -S make install && halt

natürlich ersetzen Sie <password> durch Ihr Kennwort.

11
11
11
2009-11-09 03:03:22 +0000

Sie könnten sudo auch mit visudo so konfigurieren, dass Ihr Benutzer make als sudo ohne Kennwort verwenden kann.

User_Alias USERS = your_user
Cmnd_Alias CMDS = /usr/bin/make
USERS ALL = (ALL) NOPASSWD: CMDS
10
10
10
2012-08-08 06:52:50 +0000

Einige der anderen Lösungen haben den Nachteil, dass sie unnötigerweise ./configure und make als Root ausführen.

Dies ist etwas verworren, aber es sollte funktionieren:

sudo sh -c "su $USER -c ./configure && su $USER -c make && make install && halt"

Beachten Sie die Verwendung von doppelten Anführungszeichen, damit $USER von der (Nicht-Root-)Shell erweitert werden kann.

Ich könnte auch eine sleep 60 vor dem Befehl halt hinzufügen. Ich habe manchmal Dinge wie diese getan, in der Erwartung, dass der Befehl lange läuft, aber etwas geht schief und er wird sofort beendet; mit dem Befehl sleep kann ich den Befehl beenden, bevor das System herunterfährt. Oder Sie können shutdown mit einem Zeitargument verwenden.

10
10
10
2009-11-09 03:14:31 +0000

Sie könnten Ihre Befehlszeile durch folgende Zeile ersetzen:

$sudo su

$./configure && make && make install && halt

Sie werden sofort zur Eingabe Ihres Passworts aufgefordert, dann werden die restlichen Befehle als Superuser ausgeführt.

9
9
9
2014-11-25 19:43:17 +0000

Setzen Sie HISTIGNORE auf “sudo -S

$ export HISTIGNORE='*sudo -S*'

Dann geben Sie Ihr Passwort sicher an sudo weiter:

$ echo "your_password" | sudo -S -k <command>

“HISTIGNORE” bedeutet, diesen Befehl nicht in der Historie zu speichern. Das ist die Historie im Speicher oder in der Datei “~/.bash_history”.

Zum Beispiel wird im Folgenden Ihr Passwort sicher an den sudo-Befehl weitergeleitet, ohne eine Historie Ihres Passworts aufzubewahren.

“-S” bedeutet, stdin für das Passwort zu verwenden,

“-k” bedeutet, zwischengespeicherte Anmeldeinformationen zu ignorieren, um sudo zu zwingen, immer nachzufragen. Dies ist für konsistentes Verhalten.

$ export HISTIGNORE='*sudo -S*'
$ echo "<your_password>" | sudo -S -k whoami
$ echo "<your_password>" | sudo -S -k cat /etc/shadow
$ echo "<your_password>" | sudo -S -k bash /tmp/myscript.sh

Der Nachteil der obigen Methode ist, dass die Befehle, die Sie später in der Historie ausgeführt haben, nicht vorhanden sind, wenn Sie sie sehen möchten. Eine andere Methode besteht darin, den Cache für die sudo-Authentifizierungs-Credentials zu aktualisieren (Standard ist mit 5 Minuten Timeout aktiviert) und dann das sudo separat auszuführen. Der Nachteil dabei ist jedoch, dass Sie sich des 5-Minuten-Caches bewusst sein müssen.

Zum Beispiel:

$ export HISTIGNORE='*sudo -S*'
$ echo "<your_password>" | sudo -S -v
$ sudo whoami
$ echo "<your_password>" | sudo -S -v
$ sudo cat /etc/shadow
$ echo "<your_password>" | sudo -S -v
$ sudo /tmp/myscript.sh

Hinweis Ich habe vor jedem Befehl ein sudo ausgeführt, um sicherzustellen, dass der sudo-Cache aktualisiert wird, da der Standard 5 Minuten beträgt. Ja, whoami sollte keine 5 Minuten dauern, aber ich denke, ich könnte es aus Konsistenzgründen genauso gut vor jedem Befehl laufen lassen. Sie könnten auch “export HISTIGNORE=‘sudo -S’” in Ihre ~/.bashrc-Datei schreiben und sie dann mit “. ~/.bashrc” laden oder sich abmelden und dann anmelden. Ich denke jedoch daran, dies für Skripting-Zwecke zu verwenden, daher werde ich es aus Gründen der besten Sicherheitspraktiken an den Anfang all meiner Skripte stellen. Stattdessen könnte es auch eine gute Idee sein, “echo ”“ | sudo -S -v” auf eine Variable zu setzen und dann einfach die Variable vor jedem Befehl auszuführen, der Root-Rechte benötigt, siehe Janars Kommentar. Der Kommentar von “John T” sollte auch den Parameter “-k” enthalten, denn wenn Sie “sudo -S” ohne “-k” ausführen und der sudo-Authentifizierungscache bereits Ihre Anmeldedaten enthält (und immer noch gültig ist, der Standard-Sudo-Authentifizierungscache beträgt 5 Minuten), dann wird die bash stattdessen Ihr Passwort als Befehl ausführen, was schlecht ist.

5
5
5
2015-06-09 14:15:37 +0000

Sie können dies auch tun:

sudo -S <<< "password" command
4
4
4
2014-12-08 15:18:13 +0000

Hinweis: Ich habe festgestellt, dass diese Methode bei einer älteren Version von sudo nicht funktioniert, insbesondere bei “Sudo Version 1.6.7p5”:

$ echo "<your_password>" | sudo -S -k whoami

Wo diese Methode bei älteren und neuen Versionen von sudo funktioniert:

$ echo "<your_password>" | sudo -S -v
$ sudo whoami
2
2
2
2011-04-19 23:56:23 +0000

Wenn Sie mehr Sorgfalt walten lassen wollen, könnten Sie ein Skript erstellen, die Berechtigungen der Datei so ändern, dass nur root lesen und bearbeiten kann, und es dann einfach ausführen.

Beispiel: 1) Erstellen Sie eine Datei:

gedit ~/.easy.install

2) Fügen Sie diese ein und speichern Sie:

./configure && make && echo <password> | sudo -S make install && halt

3) Machen Sie sie ausführbar:

sudo chmod +x ~/.easy.install

4) Ändern Sie die Berechtigungen der Datei, so dass nur root sie lesen und bearbeiten kann:

sudo chmod 700 ~/.easy.install

5) Führen Sie aus:

~/.easy.install

Enjoy ;-)

1
1
1
2010-11-10 03:37:15 +0000

Die Einrichtung von sudo ist gefährlich, wenn jemand zufällig gesehen hat, dass für sudo kein Passwort für Ihr Konto erforderlich ist. Wenn Sie nicht wissen, was Sie tun, tun Sie das nicht. Es ist mir bei meinem lokalen A+ Trainingsprogramm mit meinem Experimentalcomputer schon einmal zu oft passiert… -_-

Was John T. sagte, klingt zwar gut, aber es besteht immer noch das Risiko, das Passwort in der Shell-Geschichte zu finden. Was CarlF gesagt hat, klingt besser, aber wenn ein Befehl fehlschlägt, läuft der Computer immer noch mit Superuser-Privilegien.

0
0
0
2018-11-08 16:51:03 +0000

Das Problem ist gelöst. Zum Beispiel für den Benutzer root:

echo -e 'password\npassword\n' | sudo passwd root
0
0
0
2014-06-29 20:57:36 +0000

Persönlich tue ich ziemlich das Gleiche wie John T. am 9. November ‘09 um 2:47 Uhr antwortete, ich habe auch meine entsprechend der Anleitung seiner Antwort verbessert, danke.

Der Unterschied ist, dass ich dazu tendiere, Variablen zu verwenden, so etwas wie:

AutoSuDo=$" $echo pass | sudo -S";
# Change AutoSuDo to something else.
# Note that string starts with space,
# useful only if used as first command in line

Auf diese Weise kann ich leicht meine Variable anstelle von sudo verwenden,

$AutoSuDo apt-get update;

Das kommt bei einigen längeren Skripten recht praktisch. Ich benutze diese hauptsächlich für Personalcomputer anderer, die ich pflegen muss.

Ich empfehle auch zu beachten:

  • desgua Antwort am 19. April '11 um 23:56
  • user224306 Kommentar am 14. Mai '13 um 17:38 für John T Antwort am 9. November '09 um 2:47