我开发了这个期望脚本TELNET_TEST.expect来测试远程机器上的TELNET连接。
此脚本应通过目标计算机上的telnet
连接,等待登录提示,发送密码然后退出。
此脚本 工作,您可以在示例1中看到脚本通过telnet成功登录然后退出,但是一些非常令人困惑的事情(对我来说)。
为什么我的退出状态为1?我相信我应该退出状态0 ......
请告诉我为什么我要退出状态1?另外,为了获得我期待的退出代码,我需要在脚本中进行哪些更改?
我期待的剧本:
more TELNET_TEST.expect
#!/usr/bin/expect --
set LOGIN [lindex $argv 0]
set PASSWORD [lindex $argv 1]
set IP [lindex $argv 2]
set timeout 20
spawn telnet -l $LOGIN $IP
expect -re "(Password:|word:)"
send $PASSWORD\r
expect -re "(#|>)"
send exit\r
expect {
timeout {error "incorrect password"; exit 1}
eof
}
catch wait result
set STATUS [ lindex $result 3 ]
exit $STATUS
EXAMPLE1
从我的Linux机器运行expect
脚本,即使telnet登录正常,我也会获得退出状态。
./var/TELNET_TEST.expect root pass123 198.23.234.12
spawn telnet -l root pass123
Trying 198.23.234.12...
Connected to 198.23.234.12.
Escape character is '^]'.
Digital UNIX (machine1001) (ttyp0)
login: root
Password:
Last login: Mon Jul 14 16:40:15 from 198.23.234.12
Digital UNIX V4.0F (Rev. 1229); Wed Nov 23 15:08:48 IST 2005
****************************************************************************
Wide Area Networking Support V3.0-2 (ECO 3) for Digital UNIX is installed.
You have new mail.
machine1001> Connection closed by foreign host.
[root@LINUX_XOR]# echo $?
1
答案 0 :(得分:3)
我在你的会议记录中看到了这一点:
machine1001> Connection closed by foreign host.
退出代码1是"退出代码由外国主机"关闭。这就是"正确"连接被"另一方关闭时的代码" (在这种情况下,响应您的 exit
命令)。
据我所知,如果你想要退出代码0,你需要在你的telnet客户端进入命令模式并发送quit
命令。这样,连接由客户端关闭,而不是由外部主机关闭。但这是否真的更正常"比其他方式?
从GNU telnet(inetutils-1.9)的来源,文件commands.c
:
int
tn (int argc, char *argv[])
{
....
.... many many lines of code here
....
close (net);
ExitString ("Connection closed by foreign host.\n", 1);
return 0;
}
和(utilities.c
):
void
ExitString (char *string, int returnCode)
{
SetForExit ();
fwrite (string, 1, strlen (string), stderr);
exit (returnCode);
}