简体   繁体   English

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

[英]How to automate telnet session using Expect?

I'm trying to write an expect script to automate telnet. 我正在尝试编写一个expect脚本来自动执行telnet。 This is what I have so far. 这就是我到目前为止所拥有的。

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

Basically, what I want to do is telnet to the following IP address and then echo HELLO WORLD. 基本上,我想要做的是telnet到以下IP地址,然后回应HELLO WORLD。 However, it seems that the script fails after attempting to telnet...I'm not sure if it's able to accept login and password input, but it is not echoing HELLO WORLD. 但是,似乎脚本在尝试telnet后失败了......我不确定它是否能够接受登录和密码输入,但它并没有回应HELLO WORLD。 Instead, I just get this output: 相反,我只是得到这个输出:

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> 

You're sending the echo command without first expecting the prompt. 您在没有首先预期提示的情况下发送echo命令。 Try: 尝试:

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

It's hard to tell, but from the output you're pasting it looks like: 这很难说,但是从你输出的输出看起来像:

  1. Your script isn't waiting for login to complete before sending the next command. 在发送下一个命令之前,您的脚本不会等待登录完成。
  2. Your script is exiting and closing the process before you can see any output. 在您看到任何输出之前,您的脚本正在退出并关闭该进程。

There are no guarantees in life, but I'd try this as a first step: 生活中没有任何保证,但我会尝试这是第一步:

#!/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 备择方案

If you can't get your script to work by manually programming it, try the autoexpect script that comes with Expect. 如果您无法通过手动编程来使脚本工作,请尝试使用Expect附带的autoexpect脚本。 You can perform your commands manually, and autoexpect will generate an Expect typescript based on those commands, which you can then edit as needed. 您可以手动执行命令,autoexpect将根据这些命令生成Expect打字稿,然后您可以根据需要进行编辑。

It's a good way to find out what Expect actually sees, especially in cases where the problem is hard to pin down. 这是了解Expect实际看到的内容的好方法,特别是在难以确定问题的情况下。 It's saves me a lot of debugging time over the years, and is definitely worth a try if the solution above doesn't work for you. 多年来,它为我节省了大量的调试时间,如果上述解决方案对您不起作用,绝对值得一试。

Have you seen this StackOverflow Question ? 你看过这个StackOverflow问题吗?

He seems to have got things working by using curly braces. 他似乎通过使用花括号来完成工作。

Here is a simplified version 这是一个简化版本

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM