Wie das Passwort zu su / sudo / ssh passieren, ohne dass die TTY überschrieben?
Frage
Ich schreibe ein C-Shell-Programm, das su
oder sudo
oder ssh
tun werden. Sie alle wollen ihre Passwörter in Konsoleneingang (TTY), anstatt stdin oder die Befehlszeile.
Kennt jemand eine Lösung?
Einrichten von kennwort weniger sudo
ist keine Option.
könnte eine Option sein, aber es ist nicht vor meinem abgespeckte System.
Lösung
Für sudo gibt es eine Option -S für das Passwort von der Standardeingabe zu akzeptieren. Hier ist der Mann Eintrag:
-S The -S (stdin) option causes sudo to read the password from
the standard input instead of the terminal device.
Dies ermöglicht es Ihnen, einen Befehl auszuführen, wie:
echo myPassword | sudo -S ls /tmp
Wie für ssh, ich habe viele Versuche unternommen, zu automatisieren / script es Nutzung ohne Erfolg. Es scheint keinen build-in Weg, um das Passwort in das Kommando zu übergeben, ohne zu fragen. Wie andere erwähnt haben, die „ erwarten “ Dienstprogramm scheint, wie es zur Bewältigung dieses Dilemma richtet sich aber letztlich , die richtige privater Schlüssel Genehmigung der Einrichtung ist der richtige Weg zu gehen, wenn dies zu automatisieren versucht wird.
Andere Tipps
Ich schrieb einige Applescript, die über ein Dialogfeld für die Eingabe eines Kennworts auffordert und dann baut einen benutzerdefinierten bash Befehl wie folgt aus:
echo <password> | sudo -S <command>
Ich bin nicht sicher, ob das hilft.
Es wäre schön, wenn sudo ein Pre-verschlüsseltes Passwort akzeptiert, so konnte ich es in meinem Skript verschlüsseln und sie keine Sorgen über Echo Passwörter im Klartext um. Allerdings funktioniert dies für mich und meine Situation.
Für ssh
können Sie sshpass
benutzen. sshpass -p yourpassphrase ssh user@host
Sie müssen nur zum Download sshpass zuerst:)
$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server
Ich habe:
ssh user@host bash -c "echo mypass | sudo -S mycommand"
Funktioniert für mich.
Dies kann durch die Einrichtung von öffentlichen / privaten Schlüssel auf den Ziel-Hosts durchgeführt werden Sie verbinden werden. Der erste Schritt wäre, einen SSH-Schlüssel für den Benutzer zu erzeugen, um das Skript auf dem lokalen Rechner ausgeführt wird, durch 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
Dann ein leeres Passwort eingeben. Danach kopieren Sie Ihren SSH-Schlüssel auf die Ziel-Host, die Sie eine Verbindung herstellen werden.
ssh-copy-id <remote_user>@<other_host>
remote_user@other_host's password: <Enter remote user's password here>
Nach der SSH-Schlüssel der Registrierung, Sie wären in der Lage, eine stille ssh remote_user@other_host
von Ihnen lokalen Host auszuführen.
Die übliche Lösung für dieses Problem ist setuiding eine Helfer-Anwendung, die die Aufgabe, die Superuser-Zugriff ausführt: http://en.wikipedia.org/wiki/Setuid
Sudo ist nicht offline gemeint verwendet werden.
Später bearbeiten: SSH mit Private-Public-Key-Authentifizierung verwendet werden. Wenn der private Schlüssel nicht ein Passwort hat, kann ssh ohne Aufforderung für ein Passwort verwendet werden.
Für sudo Sie können dies tun, auch:
sudo -S <<< "password" command
Wenn es gibt keine bessere Wahl (wie von anderen vorgeschlagen), dann ein Mann socat helfen kann:
(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.
Alle der pty, setsid, CTTY Komplexität ist notwendig, und, wenn Sie nicht so lange schlafen könnte müssen, müssen Sie schlafen. Das Echo = 0 Option ist einen Blick wert zu, wie auf dem SSH-Befehlszeile den Remote-Befehl übergeben.
Vielleicht können Sie einen expect
Befehl verwenden:?
expect -c 'spawn ssh root@your-domain.com;expect password;send "your-password\n";interact
Dieser Befehl gibt das Passwort automatisch.
Werfen Sie einen Blick auf expect
Linux-Dienstprogramm.
Es ermöglicht Ihnen, Ausgabe senden STDIO basiert auf einfachen Muster auf stdin entsprechen.
SSH Auf dem Schlüssel ohne pasphrase für Public Key-Authentifizierung auf. Lädt der Führer auf dem Netz. Sie werden kein Passwort benötigen dann anmelden. Sie können dann auf dem Client-Host-Namen basierten Verbindungen für einen Schlüssel begrenzen. Bietet eine angemessene Sicherheit und eignet sich hervorragend für die automatisierte Anmeldungen.
ssh -t -t me@myserver.io << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF
Ich hatte das gleiche Problem. Dialogskriptverzeichnis auf dem Remote-PC zu erstellen. Dialog mit ssh ist einfach. Ich benutze sshpass (vorher installiert ist).
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 $US@$IP mkdir -p /home/$US/TARGET-FOLDER
rm /tmp/ip
rm /tmp/user
rm /tmp/pass
Grüße aus Deutschland
titus
USE:
echo password | sudo command
Beispiel:
echo password | sudo apt-get update; whoami
Hoffe, es hilft ..
Aufbauend auf @ Jahid Antwort, das für mich gearbeitet macOS 10.13:
ssh <remote_username>@<remote_server> sudo -S <<< <remote_password> cat /etc/sudoers
Sie können das Kennwort als Parameter angeben Skript zu erwarten.
echo <password> | su -c <command> <user>
Dies funktioniert.
hartzucodieren ein Passwort in einem Skript erwarten ist das gleiche wie eine passwordless sudo hat, eigentlich noch schlimmer, da sudo zumindest seine Befehle protokolliert.
Eine Möglichkeit wäre, es Option verwenden lesen .. diese Art und Weise der Passwort-Zeichen werden nicht wieder auf den Bildschirm angezeigt. Ich schrieb ein kleines Skript für einige Anwendungsfälle und man kann es in meinem Blog sehen: http://www.datauniv.com/ Blogs / 2013/02/21 / a-quick-little-expect-Skript /
su -c "Command" < "Password"
Ich hoffe, es ist hilfreich.