Вопрос:
Я пытаюсь автоматизировать сеанс telnet в Debian, но у меня возникают трудности с отправкой команд.
Взглянув сюда, я хорошо понял, что мне нужно делать.
spawn telnet localhost expect «login:» send «testn» expect «Password:» send «passwordn» sleep 10 //Time for the connection to be established send «lsn»
Запустив скрипт, он правильно ввел имя пользователя. Он попал в поле пароля, и я предполагаю, что он его ввел (хотя я не могу быть уверен, так как пароли остаются пустыми в Debian при вводе). Он остановился для ожидания, а затем вернул меня на мой счет (корень). Он никогда не связывался с “тестом”.
Изменение моего кода, чтобы быть более похожим на мою ссылку:
spawn telnet localhost expect «login:» send «testn» expect «Password:» send «passwordn» interact
Это привело к тому, что он сразу же вошел в систему и подключился к моей “тестовой” учетной записи. Отсюда я попытался добавить команды после взаимодействия с помощью send, echo и просто набрав команду. Ничего не произойдет, пока я не выйду из сеанса telnet, тогда я получу эту ошибку.
Для отправки:
send: spawn id exp6 not open while executing «send «lsn»» (file «.telnet.sh» line 8)
Для эха:
invalid command name «echo» while executing «echo «lsn»» (file «.telnet.sh» line 8)
При имени команды “ls” неверное имя команды “ls” при выполнении “ls” (файл “.telnet.sh” строка 8)
Я понимаю, что взаимодействие дает контроль пользователю, но по какой-то причине это единственный способ заставить меня подключиться к учетной записи.
Кто-нибудь знает, почему у него проблемы с подключением без взаимодействия? Если нет, почему я не могу отправить эти команды до тех пор, пока сеанс telnet не завершится с помощью взаимодействия?
EDIT. После некоторых исследований я нашел эту ссылку, которая в конце концов дошла до решения, которое ожидает сценарий ожидания сразу после того, как все будет завершено, закрывая сеанс telnet. Они сказали, что исправили проблему, добавив ожидаемый “$”, чтобы сценарий знал, что больше команд отправляется по своему пути. Я попробовал просто использовать символ “$”, как предлагалось на сайте, но это закончило пинать меня снова. Поэтому я попробовал это.
Вот мой обновленный код:
#!/usr/bin/expect spawn telnet localhost expect «debian login» send «testn» expect «Password:» send «passwordn» expect «test@debian:~$» send «lsn»
Теперь я все еще в сессии telnet около 10 секунд, а затем меня отталкивает. Если я попытаюсь ввести команду за это время, она приостанавливается на это время, затем запускает команду, которую я набрал после закрытия сеанса telnet.
Прогресс идет. Медленно, но верно.
Лучший ответ:
Я решил эту проблему, ожидая снова bash после отправки моей команды.
Когда вы бегали так:
send «passwordr» expect «*$*» send «lsr»
Сессия telnet сразу закончилась. То, что в конечном итоге работало, должно было ожидать начала сценария bash снова. Поскольку сценарий заканчивается после того, как он отправляет последнюю команду, у нее нет возможности отобразить результат введенной команды.
Я обратился к этому, добавив дополнительный ожидаемый результат, который затем позволил моей команде обработать и получить результаты.
Вот мой последний код.
#!/usr/bin/expect spawn telnet localhost set timeout 10 expect «debian login» send «testr» expect «Password:» send «passwordr» expect «*$*» send «lsn» expect «*$*» send «command2» expect «*$*» send «command3» expect «*$*» send «exitr» Ответ №1
Проблема может быть в том, что вы отправляете команду ls перед ожиданием терминала, код ожидает, что “* $ *” ожидает терминал после ввода пароля, а регулярное выражение (* $ *) может варьироваться в зависимости от переменной среды PS1 сеанс telnet, ниже – это код, который будет отображать содержимое текущего рабочего каталога и выводится из системы
spawn telnet localhost set timeout 10 expect «debian login» send «testr» expect «Password:» send «passwordr» expect «*$*» send «lsr» expect «*$*» send «logoutr»