期望脚本的退出状态错误

时间:2014-07-14 17:57:22

标签: linux bash shell tcl expect

我开发了这个期望脚本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

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);
}