Мне нужно войти ssh
дважды с помощью скрипта, и я не могу заставить его работать. Вот что у меня в файле скрипта:
#!/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
но это не удается с ошибкой:
user@host:~$ ssh: Could not resolve hostname address2: Name or service not known
send: spawn id exp7 not open
while executing
"send "$pw\r""
Если я изменю строку, spawn ssh $addr2
то exec ssh $addr2
произойдет сбой с ошибкой:
user@host:~$ ssh: Could not resolve hostname address2: Name or service not known
while executing
"exec ssh $addr2"
Что мне нужно изменить, чтобы это заработало?
решение1
Публикую свой собственный ответ, так как нашел способ обойти эту проблему. Вот скрипт, который действительно работает:
#!/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
Так что по сути я заменил строку spawn ssh $addr2
на send "ssh $addr2\r"
. Я пытался создать еще один ssh с того места, где я начал, вместо того, чтобы запустить еще один ssh на хосте, к которому я впервые подключился по ssh.
решение2
ssh
не может разрешить имя хоста, которое вы ему даете, и поэтому он выдает ошибку. Затем вы говорите expect отправить пароль, но отправлять его некуда, так как ssh выдал ошибку и вышел. Поэтому вам нужно проверить имя хоста, которое вы ему даете, так как он не разрешается. Или вы можете переключиться на IP-адрес. Но, вероятно, лучше выяснить, почему он не может определить, кто такой "address2".
решение3
Поиск генерации ключей ssl. Вы генерируете пару ключей (открытый и закрытый), сохраняете закрытый ключ(и), которые вы генерируете, в своей системе, и размещаете открытые ключи в системах, к которым вам нужно получить доступ через ssh. Тогда ssh не будет запрашивать у вас пароль, и вам не нужно ожидать.
Вот скрипт «sskkeygen.sh», который я использую для генерации ключей, чтобы я мог генерировать разные пары ключей для разных систем,
#!/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
Скопируйте ключ ~/.ssh/id_dsa.$SYSTEM.pub в удаленную систему. Будьте осторожны — во всех инструкциях говорится, что нужно скопировать ключевой файл, но вы хотите его добавить!
Затем вам понадобится файл ~/.ssh/config, который сообщает, какие ключи использовать для каких хостов.
#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