我想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
回显给文件。
欢迎任何其他解决方案
谢谢
答案 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
会更快。