【问题标题】:best way to get the result of `$?` for telnet connections获取 `$?` 用于 telnet 连接的结果的最佳方法
【发布时间】:2014-07-21 13:45:11
【问题描述】:

我想远程登录一些 ip,我想立即得到$? 的结果: 所以我尝试了:

while read ip; do
    telnet $ip 1>/dev/null 2>&1
    pkill $!
    if [ "$?" -eq "1" ]; then
       echo $ip >> host-ok
    fi
done < file

但这不是一个好主意,因为当无法建立 telnet 连接时,它就不起作用。并且总是输出$?是正确的。

我想确定 telnet 将被建立,然后终止该进程。因此,如果之后建立 telnet,我想将 $ip 回显到文件中。

欢迎任何其他解决方案

谢谢

【问题讨论】:

  • 什么意思?不,我不使用expect 命令,因为它可能有任何登录身份验证。如果你 telnet 到 correcy 主机然后 cntrl +c 它立即和错误的主机然后回显 $?你可以理解其中的区别

标签: bash process telnet kill pid


【解决方案1】:

这是我眼中最快最可靠的解决方案:

LIST=$1
while read ip;do
    echo "exit" | nc "$ip" 23 -w 5
    if [ "$?" -eq "0" ]; then
        echo "$ip" >> host-ok
    fi
done < $LIST

使用nc 而不是telnet 更快。

【讨论】:

    【解决方案2】:

    编写的代码不起作用,因为 telnet 命令不是 backgrounded - pkill $!总是失败,因为当您到达该行时进程 $! 不再存在.您需要在行尾附加一个 & 符号 &amp; 来执行此操作。在终止进程之前您还需要一个超时,否则在停止进程之前它没有时间尝试连接。 sleep 1(或 5 或 60,具体取决于您的用例)应该负责。

    您还想使用kill 而不是pkill

    另一种可能更健壮的方法是完全避免杀死,只需尝试连接并立即退出(类似于@PeteyT's answer):

    while read ip; do
        printf '%bquit\n' '\035' | telnet "$ip" 1>/dev/null 2>&1
        if [ $? -eq 0 ]; then
           echo "$ip" >> host-ok
        fi
    done < file
    

    那应该使用telnet 默认超时(我不知道那是多长时间)。如果你想要一个可配置的超时,你可以试试netcat

    【讨论】:

    • 谢谢@l0b0。你能告诉我怎么做吗?因为不起作用,但逻辑​​上是正确的
    • 上一个是正确的。但现在:如果无法建立 telnet 连接,它会写:trying x.x.x.x ... 如果我们可以发送cntrl + c,我认为会更好
    • 为什么?大多数应用程序以相同方式处理 SIGTERM 和 SIGINT。
    • 谢谢。你怎么看echo "exit" | nc x.x.x.x 23 -w 3?如果我可以 telnet 则退出并 $?=0 如果我在 3 秒后无法 telnet 则退出并 $?=1
    • 试试看效果如何。
    【解决方案3】:
     while read ip; do
       printf '%bquit\n' '\035' | telnet $ip 1>/dev/null 2>&1
       kill $!
       if [ $? -eq "1" ]; then
         echo $ip >> host-ok
       fi
     done < file
    

    【讨论】:

    • 正确吗? ` pkill 035'$!` 我觉得是少了……
    • 那是一个错字。点是。我所做的只是向您展示如何将转义序列 '^[' 发送到 telnet。
    • 谢谢。但是当我 telnet 时我有 IP,结果是Trying x.x.x.x ...。我怎样才能放弃等待这些问题
    • @MortezaLSC 这可能适合您阅读? stackoverflow.com/questions/21424985/linux-bash-timer
    猜你喜欢
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多