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