web-dev-qa-db-ger.com

Wie kann ich das Passwort an su/Sudo/ssh übergeben, ohne den TTY zu überschreiben?

Ich schreibe ein C-Shell-Programm, das su oder Sudo oder ssh ausführt. Sie alle möchten ihre Passwörter in Konsoleneingaben (TTY) anstelle von stdin oder der Befehlszeile.

Kennt jemand eine Lösung?

Einrichten des Kennworts ohne Sudo ist keine Option.

erwarten könnte eine Option sein, aber sie ist in meinem abgespeckten System nicht vorhanden.

134
n-alexander

Für Sudo gibt es eine Option -S, um das Passwort von der Standardeingabe zu akzeptieren. Hier ist der Manneintrag:

    -S          The -S (stdin) option causes Sudo to read the password from
                the standard input instead of the terminal device.

Dadurch können Sie einen Befehl wie folgt ausführen:

echo myPassword | Sudo -S ls /tmp

Was ssh angeht, habe ich viele Versuche unternommen, die Verwendung des Skripts/Skripts ohne Erfolg zu automatisieren. Es scheint keine Möglichkeit zu geben, das Kennwort ohne Aufforderung an den Befehl zu übergeben. Wie bereits erwähnt, scheint das Dienstprogramm " expect " das Dilemma anzugehen, aber letztendlich ist das Einrichten der richtigen Berechtigung für den privaten Schlüssel der richtige Weg, wenn versucht wird, dies zu automatisieren.

196
Jesse Webb

Ich habe ein Applescript geschrieben, das über ein Dialogfeld zur Eingabe eines Kennworts auffordert und dann einen benutzerdefinierten Bash-Befehl erstellt, wie folgt:

echo <password> | Sudo -S <command>

Ich bin mir nicht sicher, ob das hilft.

Es wäre schön, wenn Sudo ein vorverschlüsseltes Passwort akzeptieren würde, sodass ich es in meinem Skript verschlüsseln könnte und mich nicht darum kümmern muss, Klartextpasswörter zu wiederholen. Dies funktioniert jedoch für mich und meine Situation.

34
mlambie

Für ssh können Sie sshpass: sshpass -p yourpassphrase ssh [email protected] verwenden.

Sie müssen nur sshpass zuerst herunterladen :)

$ apt-get install sshpass
$ sshpass -p 'password' ssh [email protected]
24
Edward

Ich habe:

ssh [email protected] bash -c "echo mypass | Sudo -S mycommand"

Funktioniert bei mir.

11
David Dawson

Die übliche Lösung für dieses Problem besteht darin, eine Hilfsanwendung einzurichten, die die Aufgabe ausführt, die Superuser-Zugriff erfordert: http://en.wikipedia.org/wiki/Setuid

Sudo soll nicht offline verwendet werden.

Später bearbeiten: SSH kann mit der Authentifizierung von privaten und öffentlichen Schlüsseln verwendet werden. Wenn der private Schlüssel keine Passphrase hat, kann ssh verwendet werden, ohne dass Sie zur Eingabe eines Kennworts aufgefordert werden.

9
diciu

Dazu können Sie öffentliche/private Schlüssel auf den Ziel-Hosts einrichten, zu denen Sie eine Verbindung herstellen möchten. Der erste Schritt besteht darin, einen ssh-Schlüssel für den Benutzer zu generieren, der das Skript auf dem lokalen Host ausführt, indem Sie Folgendes ausführen:

ssh-keygen
Enter file in which to save the key (/home/myuser/.ssh/id_rsa): <Hit enter for default>
Overwrite (y/n)? y

Geben Sie dann ein leeres Passwort ein. Kopieren Sie anschließend Ihren SSH-Schlüssel auf den Ziel-Host, zu dem Sie eine Verbindung herstellen.

ssh-copy-id <remote_user>@<other_Host>
[email protected]_Host's password: <Enter remote user's password here>

Nach der Registrierung der SSH-Schlüssel können Sie von Ihrem lokalen Host aus einen stillen ssh [email protected]_Host ausführen.

9
Byob

Für Sudo können Sie dies auch tun:

Sudo -S <<< "password" command
9
Jahid

Schauen Sie sich das expect-Hilfsprogramm für Linux an.

Sie können die Ausgabe an stdio senden, basierend auf einem einfachen Musterabgleich mit stdin.

5
Marko

Wenn es keine bessere Wahl gibt (wie von anderen vorgeschlagen), kann man socat helfen:

   (sleep 5; echo PASSWORD; sleep 5; echo ls; sleep 1) |
   socat - EXEC:'ssh -l user server',pty,setsid,ctty

          EXEC’utes an ssh session to server. Uses a pty for communication
          between socat and ssh, makes it ssh’s  controlling  tty  (ctty),
          and makes this pty the owner of a new process group (setsid), so
          ssh accepts the password from socat.

Die gesamte Komplexität von pty, setsid, ctty ist notwendig, und obwohl Sie möglicherweise nicht so lange schlafen müssen, müssen Sie schlafen. Die Option echo = 0 ist ebenfalls einen Blick wert, ebenso wie das Übergeben des Remote-Befehls in der Befehlszeile von ssh.

5
Martin Dorey

Möglicherweise können Sie einen expect-Befehl verwenden:

expect -c 'spawn ssh [email protected];expect password;send "your-password\n";interact

Dieser Befehl gibt das Kennwort automatisch an.

4
adhown

Richten Sie SSH für die Authentifizierung mit öffentlichen Schlüsseln ein, wobei der Schlüssel keine Phrasen enthält. Jede Menge Guides im Netz. Sie benötigen dann kein Passwort, um sich anzumelden. Sie können dann die Verbindungen für einen Schlüssel basierend auf dem Client-Hostnamen begrenzen. Bietet angemessene Sicherheit und eignet sich hervorragend für automatisierte Anmeldungen.

1
Chris Ellis
ssh -t -t [email protected] << EOF
echo SOMEPASSWORD | Sudo -S do something
Sudo do something else
exit
EOF
1
Ed Bishop

Sie können ein Kennwort als Parameter angeben, um ein Skript zu erwarten.

0
Marko

Aufbauend auf @ Jahids Antwort funktionierte dies bei macOS 10.13 für mich:

ssh <remote_username>@<remote_server> Sudo -S <<< <remote_password> cat /etc/sudoers
0
JS.

Ich hatte das gleiche Problem. Dialogskript zum Erstellen eines Verzeichnisses auf einem Remote-PC Ich benutze sshpass (vorher installiert).

   dialog --inputbox "Enter IP" 8 78 2> /tmp/ip

   IP=$(cat /tmp/ip)


   dialog --inputbox "Please enter username" 8 78 2> /tmp/user

   US=$(cat /tmp/user)


   dialog --passwordbox "enter password for \"$US\" 8 78 2> /tmp/pass

   PASSWORD = $(cat /tmp/pass)


   sshpass -p "$PASSWORD" ssh [email protected]$IP mkdir -p /home/$US/TARGET-FOLDER


   rm /tmp/ip

   rm /tmp/user

   rm /tmp/pass

grüße aus Deutschland

titus

0
titus

BENUTZEN:

echo password | Sudo command

Beispiel: 

echo password | Sudo apt-get update; whoami

Ich hoffe es hilft..

0
Sarat Chandra