Как автоматизировать сеанс Telnet с помощью Expect?

Я пытаюсь написать ожидаемый сценарий для автоматизации telnet. Это то, что я до сих пор.

#!/usr/bin/expect
# Test expect script to telnet.

spawn telnet 10.62.136.252
expect "foobox login:"
send "foo1\r"
expect "Password:"
send "foo2\r"
send "echo HELLO WORLD\r"
# end of expect script.

По сути, я хочу сделать telnet на следующий IP-адрес, а затем повторить HELLO WORLD. Однако кажется, что сценарий завершается неудачно после попытки телнет ... Я не уверен, что он может принимать логин и пароль, но он не повторяет HELLO WORLD. Вместо этого я просто получаю этот вывод:

[email protected]:~/justin> ./hpuxrama 
spawn telnet 10.62.136.252
Trying 10.62.136.252...
Connected to 10.62.136.252.
Escape character is '^]'.
Welcome to openSUSE 11.1 - Kernel 2.6.27.7-9-pae (7).

foobox login: foo1
Password: foo2~/justin> 

Ответы на вопрос(4)

Ты виделэтот вопрос StackOverflow?

Кажется, у него все работает, используя фигурные скобки.

Вот упрощенная версия

#!/usr/bin/expect
# just do a chmod 755 one the script
# ./YOUR_SCRIPT_NAME.sh $YOUHOST $PORT
# if you get "Escape character is '^]'" as the output it means got connected otherwise it has failed

set ip [lindex $argv 0]
set port [lindex $argv 1]

set timeout 5
spawn telnet $ip $port
expect "'^]'."

Трудно сказать, но из результатов, которые вы вставляете, это выглядит так:

Your script isn't waiting for login to complete before sending the next command. Your script is exiting and closing the process before you can see any output.

В жизни нет никаких гарантий, но я бы попробовал это в качестве первого шага:

#!/usr/bin/expect -f

spawn telnet 10.62.136.252
expect "foobox login:"
send "foo1\r"
expect "Password:"
send "foo2\r"

# Wait for a prompt. Adjust as needed to match the expected prompt.
expect "justin>"
send "echo HELLO WORLD\r"

# Wait 5 seconds before exiting script and closing all processes.
sleep 5
Alternatives

Если вы не можете заставить свой сценарий работать, запрограммировав его вручную, попробуйте скрипт autoexpect, который поставляется вместе с Expect. Вы можете выполнить свои команды вручную, и autoexpect сгенерирует машинописный код Expect, основанный на этих командах, который вы затем сможете редактировать по мере необходимости.

Это хороший способ узнать, что на самом деле видит Expect, особенно в тех случаях, когда проблему трудно определить. Это сэкономит мне много времени на отладку и определенно стоит попробовать, если приведенное выше решение не сработает для вас.

Вы отправляетеecho Команда, не ожидая сначала приглашения. Пытаться:

# after sending the password
expect -re "> ?$"
send "echo HELLO WORLD\r"
expect eof

Ваш ответ на вопрос