SSH вход с ожиданием (1). Как выйти из expect и остаться в SSH? [дубликат]

этот вопрос уже есть ответ здесь:

поэтому я хотел автоматизировать свои логины SSH. Хост, с которым я работаю, не разрешает аутентификацию ключа на этом сервере, поэтому я должен был быть более изобретательным.

Я не знаю много о сценариях оболочки, но некоторые исследования показали мне команду "ожидать" и некоторые скрипты, использующие ее именно для этой цели. Я настроил скрипт и запустил его, он отлично работал для входа в систему.

#!/usr/bin/env expect -f

set password "my_password"

match_max 1000

spawn ssh -p 2222 "my_username"@11.22.11.22

expect "*?assword:*"
send -- "$passwordr"
send -- "r"

expect eof

первоначально он работает так, как должен.

Last login: Wed May 12 21:07:52 on ttys002
esther:~ user$ expect expect-test.exp
spawn ssh -p 2222 my_username@11.22.11.22
my_username@11.22.11.22's password: 
Last login: Wed May 12 15:44:43 2010 from 20.10.20.10


-jailshell-3.2$ 

но на этом успех заканчивается.

команды не работают, но нажатие enter просто создает новую строку. Клавиши со стрелками и другие не буквенно-цифровые клавиши создают символы, такие как '^[[C', '^[[A', '^[OQ' и т. д.[1]

никто не появляется, кроме два изначально созданных сценарием expect. Любые проигнорированные команды будут выполняться моей локальной оболочкой после ожидания времени ожидания. Пример:

-jailshell-3.2$ whoami
ls
pwd
hostname

(...время идет, ожидайте тайм-аута...)

esther:~ user$ whoami
user

esther:~ ciaran$ ls
Books       Documents   Movies      Public      
Code        Downloads   Music       Sites       
Desktop     Library     Pictures    expect-test.exp

esther:~ ciaran$ pwd
/Users/ciaran

esther:~ ciaran$ hostname
esther.local

как я уже сказал, У меня нет опыта сценариев оболочки, но я думаю, что это вызвано, потому что я все еще "внутри" ожидаю, но не "внутри" SSH. Есть ли способ завершить expect после входа в систему и передать мне сеанс SSH?

Я пробовал такие команды, как " закрыть "и" выйти", после "отправить -- " r"". Да, они делают то, что я хочу и ожидаю смерти, но это мстительно уничтожает сеанс SSH, оставляя меня там, где я начал. Что мне действительно нужно, так это ожидать, чтобы выполнить свою работу и завершить, оставив сеанс SSH в моих руках, как если бы я сделал это вручную.

вся помощь приветствуется, спасибо. [1] я знаю, что для этого есть название, но я не знаю, что это такое. И это одна из тех пугающих вещей, которых не может быть. погуглил, потому что знаки препинания игнорируются. В качестве побочного вопроса, что здесь происходит?

3 ответов


Я думаю, что ваша проблема была решена здесь раньше:

использование expect для передачи пароля ssh

команда вы ищете -interact. Он передает Управление вам / вашей клавиатуре.


я использовал аналогичный скрипт для autologin.

я использовал "interact", и я удалил"expect eof". Сделав это, я могу вернуть экран, чтобы я мог вводить команды вручную.

expect "?assword: "
send -- "$password\r"
expect "$"
interact

собрав все это вместе, войдите в систему и оставьте вас в командной строке точно так же, как если бы вы набрали его вручную

#!/usr/bin/expect -f
set ip "127.001.001.001"
set password "xxyykkx"
spawn ssh $ip -l root
expect "?assword:"
send "$password\r"
interact