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

Jus*_*tin 6 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.
Run Code Online (Sandbox Code Playgroud)

基本上,我想要做的是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> 
Run Code Online (Sandbox Code Playgroud)

gle*_*man 5

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

# after sending the password
expect -re "> ?$"
send "echo HELLO WORLD\r"
expect eof
Run Code Online (Sandbox Code Playgroud)


Tod*_*obs 5

很难说,但从您粘贴的输出来看,它看起来像:

  1. 在发送下一个命令之前,您的脚本不会等待登录完成。
  2. 在您看到任何输出之前,您的脚本正在退出并关闭进程。

生活中没有任何保证,但我会尝试将其作为第一步:

#!/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
Run Code Online (Sandbox Code Playgroud)

备择方案

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

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


rky*_*ser 1

你见过这个 StackOverflow 问题吗?

他似乎通过使用花括号让事情正常运转。