
Dies sind Standardbefehle sshpass
zum Lesen des Passworts aus einer Datei oder als Argument.
user@linux:~$ sshpass -f pwd.txt ssh admin@server
admin@server:~$
user@linux:~$ sshpass -p P@55 ssh admin@server
admin@server:~$
Ist es möglich, dasselbe Programm/Skript in der Shell zu schreiben, wenn diese expect
nicht verfügbar ist?
Public/private
Schlüssel ist in diesem Fall keine Option.
sshpass
Wenn Code verfügbar ist, der die gleiche Funktionalität wie der vorhandene bietet , lassen Sie es mich bitte wissen.
Je einfacher der Code, desto besser.
Antwort1
Sie können es script(1)
als Mini-Expect verwenden, vorausgesetzt, Sie kommen mit der Anpassung beliebiger Timeouts zurecht, was natürlich ziemlich umständlich ist:
{ sleep 1; echo PASSWD; } | script -q /dev/null -c 'ssh user@host CMD'
oder mit der Syntax von BSD script(1)
:
{ sleep 1; echo PASSWD; } | script -q /dev/null ssh user@host CMD
Dies sleep
ist notwendig, da ssh
der Eingabepuffer des TTY geleert wird (und alles, was bereits hineingeschrieben wurde, verworfen wird), bevor das Passwort gelesen wird. Wenn der Remote-ServerManchmalDa die Reaktion langsam ist, ist die Verwendung eines „ausreichend großen“ Timeouts möglicherweise unpraktisch.
sshpass
usw. expect
handhaben das, indem sie warten, bis ssh
die ... password:
Eingabeaufforderung geschrieben wird, bevor sie das Passwort an das Master-Ende des pty schreiben. Das von einer Standard-Shell aus zu tun, ist weder einfach noch sehr robust. Hier ist ein Kludge mit einer benannten Pipe:
passwdcmd(){
t=$(mktemp -u); mkfifo "$t" || return
script /dev/null -qc "$2" <>"$t" | { dd count=1 2>/dev/null; echo "$1" >"$t"; rm "$t"; cat; }
}
passwdcmd PASSWD 'ssh user@host CMD'
Natürlich ist das nicht sehr sicher, zumal echo
möglicherweise keine Shell eingebaut ist. Für jede nicht-interaktive Nutzung von ssh,Public-Key-Authentifizierung verwenden.
Antwort2
Habe gerade ein tolles Bash-Skript gefunden, das SSHPASS auf reinem Bash implementiert: