我想测试主机上的特定端口是否打开。我正在使用:
nc -z host 22
nc -z host 80
nc -z host 443
nc -z host 8080
它可以工作,但是最好使用如下的一行代码:
nc -z host 22 80 443 8080
这是行不通的。
如果可能的话,我希望避免nc -z host 22-8080
使用手册页中注明的端口范围,因为我要检查的端口号之间有很大差距。另外,我不想扫描每个端口,以免被视为扫描开放端口。
除了编写 bash 循环之外,我还有什么选择来测试端口是否打开?我有几十台主机,每台主机都有一些端口需要检查。
答案1
我使用-w 1
下面的方法来限制超时为 1 秒。我也使用-v
评论中提到的原因。我曾经-n
拒绝反向 DNS 查找的延迟...
[mpenning@tsunami ~]$ for i in $(echo "172.16.1.1,172.16.1.5"|tr "," "\n"); do echo -e "22\n80\n443\n8080" | xargs -i nc -w 1 -zvn $i {}; done
(UNKNOWN) [172.16.1.1] 22 (ssh) open
(UNKNOWN) [172.16.1.1] 80 (www) : Connection timed out
(UNKNOWN) [172.16.1.1] 443 (https) open
(UNKNOWN) [172.16.1.1] 8080 (http-alt) : Connection timed out
(UNKNOWN) [172.16.1.5] 22 (ssh) open
(UNKNOWN) [172.16.1.5] 80 (www) open
(UNKNOWN) [172.16.1.5] 443 (https) open
(UNKNOWN) [172.16.1.5] 8080 (http-alt) : Connection refused
[mpenning@tsunami ~]$
答案2
如果你喜欢GNU 并行像我一样,尝试一下这个:
parallel nc -vz host ::: 22 80 443 8080
示例输出:
Connection to foo.example.com 22 port [tcp/ssh] succeeded!
nc: connect to foo.example.com port 80 (tcp) failed: Connection refused
nc: connect to foo.example.com port 443 (tcp) failed: Connection refused
nc: connect to foo.example.com port 8080 (tcp) failed: Connection refused
在某些情况下,这种方法也更快,因为它测试的是并行端口连接,而不是串行端口连接。具体来说,远程主机(或中间防火墙)会丢弃您的数据包以保持隐秘(而不是成功连接或强制拒绝)。
提示:在大多数 Linux 发行版中,您可以parallel
从包管理器进行安装。
更新:使用parallel
,这可以很好地概括经常需要的多个主机 x 多个端口的情况。以下示例使用 来parallel
迭代交叉乘积,因此您无需编写任何嵌套循环。
parallel nc -vz ::: host1 host2 host3 ::: 22 80 443 8080
输出:
Connection to host1 22 port [tcp/ssh] succeeded!
Connection to host1 80 port [tcp/http] succeeded!
Connection to host1 443 port [tcp/https] succeeded!
nc: connect to host1 port 8080 (tcp) failed: Connection refused
Connection to host2 22 port [tcp/ssh] succeeded!
nc: connect to host2 port 80 (tcp) failed: Connection refused
nc: connect to host2 port 443 (tcp) failed: Connection refused
nc: connect to host2 port 8080 (tcp) failed: Connection refused
Connection to host3 22 port [tcp/ssh] succeeded!
nc: connect to host3 port 80 (tcp) failed: Connection refused
nc: connect to host3 port 8080 (tcp) failed: Connection refused
nc: connect to host3 port 443 (tcp) failed: Connection refused
就像前面的示例一样,parallel
并行执行连接测试。请注意,默认并行度是系统有多少个线程,但可以通过切换-j
到任何值轻松覆盖。由于测试套接字不是一项 CPU 密集型任务,因此您可以轻松实现parallel -j 50 ...
甚至更高的 并行度。
答案3
Netcat 并不是真正的扫描器,因为评论表明 nmap 在这里会是更好的选择。如果不使用端口范围选项,我猜你只能将其包装在 shell 脚本中;
for host in $(cat hostlist); do
for port in $ports; do nc -z $host $port; done
done
ETC..
答案4
在 Redhat 6 中,你可以运行如下命令:
nc -znv -w 2 <host> <port1>; nc -znv -w 2 <host> <port2>
-z 测试端口
-n 不解析 DNS
-v 给出详细输出
-w 2 秒后超时
;只要您不介意再次输入,就会一个接一个地输入命令。
如果您正在扫描多个端口,我喜欢使用循环的建议,但是如果是 2 或 3,并且您已经尝试使用 SSH 之类的东西循环遍历列表,那么像这样的字符串命令很有用。