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.
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.
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.
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]
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.
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.
Für Sudo können Sie dies auch tun:
Sudo -S <<< "password" command
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.
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.
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.
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.
ssh -t -t [email protected] << EOF
echo SOMEPASSWORD | Sudo -S do something
Sudo do something else
exit
EOF
Sie können ein Kennwort als Parameter angeben, um ein Skript zu erwarten.
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
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
BENUTZEN:
echo password | Sudo command
Beispiel:
echo password | Sudo apt-get update; whoami
Ich hoffe es hilft..