Sudo mit Passwort in einer Kommandozeile?

115

An arbeitsreichen Tagen möchte ich rennen

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

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

Jichao
quelle
Sie müssen haltals root ausgeführt werden.
Keith Thompson
1
Keine sudo15-minütige Unterbrechung? Könnten Sie nicht ausführen, sagen wir, sudo lsoder ähnliches, Ihr Passwort eingeben und dann den obigen Befehl ausführen, wobei die sudoBerechtigungen noch aktiv sind? (Ich kann das im Moment nicht testen, sonst würde ich das als Antwort posten.)
Matt
1
Die Zeitüberschreitung sudoist konfigurierbar. Sicherheitsbewusste (auch bekannt als paranoid, wie ich) setzen es auf Null ... :-)
dda

Antworten:

173

Ja, benutze den -SSchalter, der das Passwort von STDIN liest:

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

Für Ihren Fall würde es also so aussehen:

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

natürlich durch <password>dein passwort ersetzen .

John T
quelle
42
Offensichtlich würde man dies nicht ausführen wollen, wenn die Gefahr besteht, dass jemand anderes das Passwort im Shell-Verlauf sieht.
Brett Daniel
Suchen Sie nach schnellen Möglichkeiten, um privilegierte Befehle auf einem Remote-Host auszuführen, und dies funktioniert danke.
Nelaaro
13
Wenn Sie sich für die Verwendung von 'echo <Kennwort> | entschieden haben Um zu vermeiden, dass das Kennwort im Befehlsverlauf angezeigt wird, starten Sie den Befehl mit einem LEERTASTE-Zeichen. Die beste Option ist natürlich, das Passwort aus einer sicheren Datei zu leiten.
Shannon Haworth
Vielleicht möchten Sie das verwenden, wenn Sie das Kennwort in einem $ VARIABLE haben (das Sie zum Beispiel mit Sops versehen könnten)
Natim
9 Jahre später und funktioniert immer noch wie ein Zauber :)
WinEunuuchs2Unix
10

Sie können Ihre Befehlszeile folgendermaßen ersetzen:

$sudo su

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

Sie werden sofort zur Eingabe Ihres Kennworts aufgefordert, und der Rest der Befehle wird als Superuser ausgeführt.

CarlF
quelle
8
eine alternative (und wahrscheinlich bevorzugte) Version davon:sudo sh -c "./configure && make && make install && halt"
quack quixote
2
Aber hätten dann nicht alle generierten Kompilierungsdateien die Superuser-Berechtigungen? Dies würde verhindern, dass Sie später ./configure && make als regulärer Benutzer ausführen.
User45909
Ja, user45909, du hast vollkommen recht. Ich persönlich habe ./configure && nie erneut ausgeführt, außer nach dem Herunterladen eines Updates des Hauptpakets, aber ich bin wahrscheinlich nicht typisch.
CarlF
10

Einige der anderen Lösungen haben den Nachteil, dass sie unnötig laufen ./configureund makeals root fungieren.

Das ist ein bisschen kompliziert, 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, um $USERdie Erweiterung durch die Shell (ohne Rootberechtigung) zu ermöglichen.

Ich könnte auch einen sleep 60vor dem haltBefehl hinzufügen . Ich habe manchmal Dinge wie diese getan, in der Erwartung, dass der Befehl lange ausgeführt wird, aber etwas geht schief und er wird sofort beendet. Damit kann sleepich den Befehl beenden, bevor das System heruntergefahren wird. Oder Sie können shutdownmit einem Zeitargument verwenden.

Keith Thompson
quelle
9

Sie können sudo auch so konfigurieren visudo, dass der Benutzer make als sudo ohne Kennwort verwenden kann.

User_Alias USERS = your_user
Cmnd_Alias CMDS = /usr/bin/make
USERS ALL = (ALL) NOPASSWD: CMDS
Natim
quelle
9

Setze 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. Dies ist der Verlauf im Speicher oder die Datei "~ / .bash_history".

Im Folgenden wird Ihr Kennwort beispielsweise sicher an den Befehl sudo weitergeleitet, ohne dass der Verlauf Ihres Kennworts beibehalten wird.

"-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 ein 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 im Verlauf ausgeführt haben, nicht vorhanden sind, wenn Sie sie sehen möchten. Eine andere Methode besteht darin, den Cache für Anmeldeinformationen für die sudo-Authentifizierung zu aktualisieren (standardmäßig ist eine Zeitüberschreitung von 5 Minuten aktiviert) und dann sudo separat auszuführen. Der Nachteil ist jedoch, dass Sie sich des 5-Minuten-Cache 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 Standardwert 5 Minuten beträgt. Ja, whoami sollte nicht 5 Minuten dauern, aber ich nehme an, es könnte genauso gut vor jedem Befehl ausgeführt werden, um die Konsistenz zu gewährleisten. Sie könnten auch "export HISTIGNORE = ' sudo -S" setzen'"in Ihre ~ / .bashrc - Datei und laden Sie sie mit". ~ / .bashrc "oder Abmelden und dann Anmelden. Ich denke jedoch, dies für Skriptzwecke zu verwenden, so dass ich es aus Sicherheitsgründen immer auf dem neuesten Stand halte. Einstellen von" echo "" | sudo -S -v "für eine Variable könnte ebenfalls eine gute Idee sein. Führen Sie die Variable dann einfach vor jedem Befehl aus, der Root-Berechtigungen benötigt, siehe Janars Kommentar. Der Kommentar von" John T "sollte auch den Parameter" -k "enthalten Wenn Sie "sudo -S" ohne "-k" ausführen und der sudo-Authentifizierungscache bereits über Ihre Anmeldeinformationen verfügt (und weiterhin gültig ist, beträgt der Standardcache für die sudo-Authentifizierung 5 Minuten), führt bash stattdessen Ihr Kennwort als Befehl aus Schlecht.

user393365
quelle
1
Führen Sie Ihren Befehl mit einem einzelnen Leerzeichen voran aus. Aus irgendeinem Grund ignoriert dies die Historie.
Matt Fletcher
4

Beachten Sie, dass die Methode in einer älteren Version von sudo nicht funktioniert, insbesondere in "Sudo Version 1.6.7p5":

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

Wo wie diese Methode funktioniert auf älteren und neuen Versionen sudo:

$ echo "<your_password>" | sudo -S -v
$ sudo whoami
Darren DeHaven
quelle
Dies ist keine Antwort auf die ursprüngliche Frage. Wenn Sie einen Autor kritisieren oder um Klarstellung bitten möchten, hinterlassen Sie einen Kommentar unter seinem Beitrag. Sie können jederzeit Ihre eigenen Beiträge kommentieren. Wenn Sie über eine ausreichende Reputation verfügen, können Sie jeden Beitrag kommentieren .
DavidPostill
@ Darren DeHaven: Könnten Sie bitte erklären, wie dies zu einer Antwort auf die hier gestellte Frage wird?
Renju Chandran Chingath
4

Sie können dies auch tun:

sudo -S <<< "password" command
Jahid
quelle
nur dieses funktioniert bei mir in mac os.
Mehdico,
2

Wenn Sie mehr Sorgfalt walten lassen möchten, können Sie ein Skript erstellen, die Berechtigungen der Datei ändern, damit nur root sie lesen und bearbeiten und dann einfach ausführen kann.

Beispiel:
1) Erstellen Sie eine Datei:

gedit ~/.easy.install  

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

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

3) Machen Sie es 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  

Genießen ;-)

desgua
quelle
echo <Passwort> wird weiterhin in der Prozessliste angezeigt. Wenn jemand im richtigen Moment Glück mit ps aux hat, kann er das Passwort im Klartext sehen. Es ist besser, das Kennwort in einer Datei zu speichern und mit <von der Datei nach sudo umzuleiten.
Bobpaul
1

Das Einrichten von sudo ist gefährlich, wenn zufällig festgestellt wird, dass sudo kein Kennwort für Ihr Konto benötigt. Wenn Sie nicht wissen, was Sie tun, tun Sie das nicht. Ich hatte es in meinem lokalen A + Training-Programm mit meinem experimentellen Computer ein zu oft ... -_-

Was John T. gesagt hat, hört sich gut an, es besteht jedoch die Gefahr, dass das Kennwort im Shell-Verlauf gefunden wird. Was CarlF sagte, klingt besser, aber wenn ein Befehl fehlschlägt, wird der Computer weiterhin mit Superuser-Berechtigungen ausgeführt.

Zeit.
quelle
0

Persönlich mache ich genau das Gleiche wie John T. am 9. November 09 um 2:47, ich habe auch meinen verbessert, gemäß der Anleitung seiner Antwort, danke.

Der Unterschied ist, dass ich normalerweise Variablen benutze, 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 ist bei längeren Skripten sehr praktisch. Ich benutze diese hauptsächlich für PCs anderer, die ich warten muss.

Ich empfehle auch, auf Folgendes zu achten:

  • desgua antworte am 19. April 11 um 23:56 Uhr
  • user224306 comment am 14. Mai 13 um 17:38 für John T reply am 9. November 09 um 2:47
Janar
quelle
0

Das Problem ist gelöst. Zum Beispiel an den Benutzer root:

echo -e 'password\npassword\n' | sudo passwd root
Jerson Martínez
quelle
Was macht -e flag, @jerson Martinez?
user674669
1
Das -e-Flag für Echo ermöglicht es, bestimmte Sequenzen als besondere Bedeutungen zu interpretieren.
Jerson Martínez