Ich muss mich mit einem Skript zweimal anmelden ssh
und bekomme es nicht zum Laufen. Folgendes steht in meiner Skriptdatei:
#!/usr/bin/expect
set login "user"
set addr "address1"
set addr2 "address2"
set pw "password"
spawn ssh $login@$addr
expect "$login@$addr\'s password:"
send "$pw\r"
expect "$login@host:"
spawn ssh $addr2
expect "$login@$addr\'s password:"
send "$pw\r"
interact
Dies schlägt jedoch mit dem Fehler fehl:
user@host:~$ ssh: Could not resolve hostname address2: Name or service not known
send: spawn id exp7 not open
while executing
"send "$pw\r""
Wenn ich die Zeile ändere, schlägt es spawn ssh $addr2
mit exec ssh $addr2
dem Fehler fehl:
user@host:~$ ssh: Could not resolve hostname address2: Name or service not known
while executing
"exec ssh $addr2"
Was muss ich ändern, damit das funktioniert?
Antwort1
Ich poste meine eigene Antwort, da ich einen Weg gefunden habe, dieses Problem zu umgehen. Hier ist das Skript, das tatsächlich funktioniert:
#!/usr/bin/expect
set login "user"
set addr "address1"
set addr2 "address2"
set pw "password"
spawn ssh $login@$addr
expect "$login@$addr\'s password:"
send "$pw\r"
expect "$login@host:"
send "ssh $addr2\r"
expect "$login@$addr\'s password:"
send "$pw\r"
interact
Ich habe die Zeile also grundsätzlich spawn ssh $addr2
durch ersetzt send "ssh $addr2\r"
. Ich habe versucht, von dort, wo ich gestartet bin, ein weiteres SSH zu starten, anstatt ein weiteres SSH auf dem Host zu starten, zu dem ich zuerst per SSH verbunden war.
Antwort2
ssh
kann den Hostnamen, den Sie ihm geben, nicht auflösen und gibt daher einen Fehler aus. Sie sagen expect dann, dass es das Passwort senden soll, aber es gibt keinen Ort, an den es gesendet werden kann, da ssh den Fehler ausgegeben und beendet hat. Sie müssen also den Hostnamen überprüfen, den Sie ihm geben, da er nicht aufgelöst wird. Oder Sie können zu einer IP-Adresse wechseln. Aber es ist wahrscheinlich besser, herauszufinden, warum es nicht herausfinden kann, wer „address2“ ist.
Antwort3
Suchen Sie nach der Generierung von SSL-Schlüsseln. Sie generieren ein Schlüsselpaar (öffentlich und privat), behalten die privaten Schlüssel, die Sie generieren, auf Ihrem System und platzieren die öffentlichen Schlüssel auf Systemen, auf die Sie über SSH zugreifen müssen. Dann fordert SSH Sie nicht zur Eingabe eines Passworts auf und Sie müssen nicht warten.
Hier ist ein Skript, "sskkeygen.sh", das ich zum Generieren von Schlüsseln verwende, sodass ich verschiedene Schlüsselpaare für verschiedene Systeme generieren kann.
#!/bin/bash
SYSTEM=${1:-boogie}
COMMENT=${2:-"Key for $SYSTEM work"}
ssh-keygen -t dsa -f ~/.ssh/id_dsa.$SYSTEM -C "$COMMENT"
chmod 600 ~/.ssh/id_dsa.$SYSTEM
chmod 600 ~/.ssh/id_dsa.$SYSTEM.pub
Kopieren Sie den Schlüssel ~/.ssh/id_dsa.$SYSTEM.pub auf das Remote-System. Seien Sie vorsichtig – in allen Anweisungen steht, dass Sie die Schlüsseldatei kopieren sollen, aber Sie möchten sie anhängen!
Dann benötigen Sie eine Datei ~/.ssh/config, die angibt, welche Schlüssel für welche Hosts zu verwenden sind.
#key: prod
Host 1.2.3.4
IdentityFile ~/.ssh/id_dsa.prod
User meself
#key: dev/test
Host 2.3.1.4
IdentityFile ~/.ssh/id_dsa.dev
User meself
#key: ftp dropbox
Host dropbox.company.com
IdentityFile ~/.ssh/id_dsa.dropbox
User virtualuser
#key: ftp thing
Host aaa.bbb.thing.com
IdentityFile ~/.ssh/id_dsa.think
User neato
#key: work
Host *.work.com
IdentityFile ~/.ssh/id_dsa.work
User workid