如何从shell脚本获取telnet执行结果代码?

时间:2013-01-20 16:37:55

标签: shell unix telnet

使用以下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连接正常。

2 个答案:

答案 0 :(得分:3)

Telnet以这种方式编写脚本非常困难,因此建立连接所需的时间与完成预期的操作之间存在高度的异步性。 expect就是出于这种目的而创建的。你启动一个程序,比如telnet,然后声明一系列的期望 - 例如,从程序发出'username:',以及触发的动作(例如:输入用户名)。

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

这是一个驱动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是一个更好的选择,支持更好的身份验证选择(例如:public/private key auth),restrictions for commands可以运行(通过.ssh / authorized_keys)。使用ssh和ssh-keys设置,您的脚本将缩减为单个shell命令:

ssh user@hostname ls

ssh非常支持安全,可靠的远程命令执行。

答案 1 :(得分: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