Skript zum zweimaligen Anmelden bei SSH

Skript zum zweimaligen Anmelden bei SSH

Ich muss mich mit einem Skript zweimal anmelden sshund 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 $addr2mit exec ssh $addr2dem 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 $addr2durch 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

sshkann 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

verwandte Informationen