【问题标题】:How to get telnet execution result code from shell script?如何从 shell 脚本中获取 telnet 执行结果代码?
【发布时间】:2013-01-03 19:11:27
【问题描述】:

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

【问题讨论】:

  • 使用expect(1) 编写交互式程序。
  • 我支持这个。 Expect 对于自动化交互式任务非常有用。

标签: shell unix telnet


【解决方案1】:

以这种方式编写 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 是一个更好的选择,它支持更好的身份验证选择(例如:public/private key auth)、可以运行的restrictions for commands(通过.ssh/authorized_keys)。设置好 ssh 和 ssh-keys 后,您的脚本可以简化为一个 shell 命令:

ssh user@hostname ls

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

【讨论】:

    【解决方案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

    【讨论】:

      猜你喜欢
      • 2020-03-05
      • 2019-12-29
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多