sshpass-Alternative in Linux-Shell/Bash-Code

sshpass-Alternative in Linux-Shell/Bash-Code

Dies sind Standardbefehle sshpasszum 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 expectnicht verfügbar ist?

Public/privateSchlüssel ist in diesem Fall keine Option.

sshpassWenn 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 sleepist notwendig, da sshder 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.

sshpassusw. expecthandhaben das, indem sie warten, bis sshdie ... 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 echomö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:

verwandte Informationen