1

使用以下 shell 代码进行远程 telnet 请求:

{
sleep 5
echo admin
sleep 3
echo pass
sleep 3
echo ls
sleep 5
echo exit
} | telnet 172.16.1.1

我想检查 telnet 连接是否成功。尝试使用 $?:

echo $?

但它总是返回“1”,即使 telnet 连接正常。

4

2 回答 2

3

Telnet 以这种方式编写脚本非常困难,与建立连接和完成预期操作所需的时间高度不同步。 expect正是为了这种目的而创建的。您启动一个程序,如 telnet,然后声明一系列期望 - 例如,当从程序发出“用户名:”时,以及要触发的操作(例如:输入用户名)。

还有许多语言的库或包装器:

下面是一个驱动 telnet 发出 HTTP HEAD 请求的示例:

set timeout 20

spawn telnet localhost 80

expect "Connected to "
send "HEAD / HTTP/1.0\r\n\r\n"

expect "HTTP 200 OK"

鉴于所有这些,我觉得我必须指出 telnet 被认为是不安全的。 SSH是一个更好的选择,它支持更好的身份验证选择(例如:公钥/私钥 auth),对可以运行的命令的限制(通过 .ssh/authorized_keys)。设置 ssh 和 ssh-keys 后,您的脚本将简化为单个 shell 命令:

ssh user@hostname ls

ssh 对安全、可靠的远程命令执行有很好的支持。

于 2013-01-20T16:44:34.980 回答
2

如果我没记错的话,这个期望脚本会执行您在上面所做的事情。

#!/usr/bin/expect

spawn telnet 172.16.1.1

expect username:
send admin
expect password:
send pass
expect "\$ "
send ls
expect "\$ "
send exit

这是一个有用的入门链接:http: //oreilly.com/catalog/expect/chapter/ch03.html

于 2013-01-20T16:52:59.663 回答