获取telnet连接的`$?`结果的最佳方法

时间:2014-06-01 07:23:10

标签: bash process telnet kill pid

我想telnet一些ips,我想立即获得$?的结果: 所以我试过了:

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回显给文件。

欢迎任何其他解决方案

谢谢

3 个答案:

答案 0 :(得分:2)

编写的代码不起作用,因为telnet命令不是backgrounded - pkill $! 总是失败,因为进程{{1当你到达那条线时不再存在。你需要在行尾添加一个与号$!来做到这一点。在终止进程之前还需要 timeout ,否则在停止之前它没有时间尝试连接。 &(或5或60,取决于您的使用案例)应该照顾它。

您还想使用sleep 1而不是kill

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

pkill

那应该使用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 默认超时(我不知道它有多长)。如果您需要可配置的超时,可以尝试netcat

答案 1 :(得分:1)

 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

答案 2 :(得分:0)

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

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会更快。

相关问题