如何使用Expect自动化telnet会话?

时间:2012-06-28 18:14:25

标签: linux telnet expect

我正在尝试编写一个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。但是,似乎脚本在尝试telnet后失败了......我不确定它是否能够接受登录和密码输入,但它并没有回应HELLO WORLD。相反,我只是得到了这个输出:

cheungj@sfgpws30:~/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 个答案:

答案 0 :(得分:5)

您在没有首先预期提示的情况下发送echo命令。尝试:

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

答案 1 :(得分:4)

很难说,但是从你输出的输出看起来像是:

  1. 在发送下一个命令之前,您的脚本没有等待登录完成。
  2. 您的脚本正在退出并关闭该流程,然后才能看到任何输出。
  3. 生活中没有任何保证,但我会尝试这是第一步:

    #!/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
    

    替代

    如果您无法通过手动编程来使脚本工作,请尝试使用Expect附带的autoexpect脚本。您可以手动执行命令,autoexpect将根据这些命令生成Expect打字稿,然后您可以根据需要进行编辑。

    这是了解Expect实际看到的内容的好方法,特别是在问题难以确定的情况下。多年来,它为我节省了大量的调试时间,如果上述解决方案不适合您,那么绝对值得一试。

答案 2 :(得分:1)

你见过this StackOverflow Question吗?

他似乎通过使用花括号来完成工作。

答案 3 :(得分:0)

这是简化版

#!/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 "'^]'."
相关问题