为什么使用 netcat 检查主机是否启动的 shell 片段会过早停止?

为什么使用 netcat 检查主机是否启动的 shell 片段会过早停止?

问:为什么第二次迭代在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

関連情報