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

时间:2021-07-04 18:15:36

I'm trying to write an expect script to automate telnet. This is what I have so far.

我正在尝试编写一个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.

Basically, what I want to do is telnet to the following IP address and then echo 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. Instead, I just get this output:

基本上,我想做的是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 个解决方案

#1


5  

You're sending the echo command without first expecting the prompt. Try:

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

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

#2


3  

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. 在发送下一个命令之前,您的脚本不会等待登录完成。

  3. Your script is exiting and closing the process before you can see any output.
  4. 您的脚本正在退出并关闭进程,然后才能看到任何输出。

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. You can perform your commands manually, and autoexpect will generate an Expect typescript based on those commands, which you can then edit as needed.

如果您无法通过手动编程来使脚本工作,请尝试使用Expect附带的autoexpect脚本。您可以手动执行命令,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. 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.

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

#3


1  

Have you seen this * Question?

你看过这个*问题吗?

He seems to have got things working by using curly braces.

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

#4


0  

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

#1


5  

You're sending the echo command without first expecting the prompt. Try:

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

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

#2


3  

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. 在发送下一个命令之前,您的脚本不会等待登录完成。

  3. Your script is exiting and closing the process before you can see any output.
  4. 您的脚本正在退出并关闭进程,然后才能看到任何输出。

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. You can perform your commands manually, and autoexpect will generate an Expect typescript based on those commands, which you can then edit as needed.

如果您无法通过手动编程来使脚本工作,请尝试使用Expect附带的autoexpect脚本。您可以手动执行命令,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. 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.

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

#3


1  

Have you seen this * Question?

你看过这个*问题吗?

He seems to have got things working by using curly braces.

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

#4


0  

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