使用以下 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 连接正常。
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 对安全、可靠的远程命令执行有很好的支持。
如果我没记错的话,这个期望脚本会执行您在上面所做的事情。
#!/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