问:为什么第二次迭代在10.175.192.16之后退出?有人可以解释一下吗?或者我刚刚发现了一个“while/netcat”错误?
a.txt的内容:
$ cat a.txt
10.175.192.14
10.175.192.16
10.175.192.17
$
第一次迭代,这样就可以了,只是输出文件内容:
$ while read oneline; do echo $oneline; done < a.txt
10.175.192.14
10.175.192.16
10.175.192.17
$
第二次迭代,这很糟糕,当到达 10.175.192.16 时它就存在:
$ while read oneline; do nc -w 3 "$oneline" 22 >& /dev/null; echo $oneline; done < a.txt
10.175.192.14
10.175.192.16
$
退出代码:
$ nc -w 3 "10.175.192.14" 22 >& /dev/null; echo $?
1
$ nc -w 3 "10.175.192.16" 22 >& /dev/null; echo $?
0
所以10.175.192.14后面没有SSH服务器。但10.175.192.16后面还有一个。但是“while”迭代在遍历所有行之前不应该退出,不是吗?为什么缺少 10.175.192.17?我在这里缺少什么?
我的主要目的是拥有一个包含 IP 地址的文件 (a.txt)。我需要在两个文件中对这些 IP 地址进行排序:
A)可访问的(ssh 正在提示,因此服务器可用)
B)不可访问的(3 秒后超时,因为没有任何监听)端口 22)
“可达”意味着是否有任何东西在 IP 后面的端口 22 上侦听。
答案1
我想我有一个答案:当nc
尝试一个在端口 22 上侦听的服务器(通常是 SSH 服务器)的 IP 地址时,它会读取其余的输入并将其传递到端口 22 上的服务器。我拥有的 SSH 服务器在我的家用机器上运行只会消耗输入。
我的(Slackware 13.1系统nc
)有一个“-z”选项,用于“零 I/O”。尝试
nc -z -w 3 "$oneline" >& /dev/null
作为 while 循环中的命令。我认为还nc
存在其他实现。netcat
例如,有一个 GNU ,但它也需要一个“-z”选项。
答案2
10.175.192.16 末尾有任何特殊符号可能会破坏吗?您可以尝试在没有“读取”命令的情况下分析文件:
HOSTS=`cat a.txt`
for host in $HOSTS; do
code=`nc -w 3 -z "$host" 22 >& /dev/null; echo $?`
if [ "$code" == "0" ]; then
echo $host >> reachable.txt
else
echo $host >> unreachable.txt
fi
done