如何让Netcat返回未使用的端口

3
我尝试使用这个命令来查找未使用的端口。我想让它在一系列端口上运行netcat,找到没有运行服务的端口,然后筛选出这些输出中的第一个,并使用sed仅输出端口号。
nc -z <my url> 5000-5010 | grep -m 1 succeeded | sed 's/[^0-9]//g'

但当我尝试使用返回的端口启动服务时,我得到了一个消息,说该端口正在使用中。

我发现 netcat 成功意味着一个服务正在该端口上运行,但当我尝试这样做时:

nc -zv <my url> 5000-5010 | grep -m 1 failed | sed 's/[^0-9]//g'

我什么都没有收到,即使大多数输出行包含“failed”一词。
查看man页后发现netcat -z仅返回成功结果的输出,但为什么我的终端窗口会连续显示失败的连接行,这仍然超出了我的理解范围。
我如何使用netcat查看连接失败的第一个端口?

3
你可能希望调查一下nmap,它是一个网络扫描工具,可以使这个任务更容易。 - larsks
2个回答

2
获取Linux系统上关闭(未使用)端口的列表,您可以使用以下命令:
实时输出:
#!/bin/bash
remoteHost=stackoverflow.com
for i in {80..100}
do 
   nc -v -z -w 1 $remoteHost $i &> /dev/null && echo "Port $i Open" || echo "Port $i Closed" 
done

如果需要,您可以将当前设置为 1 秒的超时时间 (-w 1) 更改为更高的值。


输出:

Port 80 Open
Port 81 Closed
Port 82 Closed
Port 83 Closed
Port 84 Closed
Port 85 Closed
etc..

nc参数:

-v 使nc输出更详细的信息。

-z 指定nc只扫描监听的守护进程,而不向它们发送任何数据。在使用-l选项时使用此选项是错误的。

-w 超时时间 如果连接和标准输入空闲超过timeout秒,则连接会被静默关闭。-w标志对-l选项没有影响,即nc将永远监听连接,有或没有-w标志。默认情况下没有超时。


资源

nc手册


1

nc -v 命令会将失败/成功消息写入标准错误输出,而非标准输出。您可以使用 2>&1 将标准错误输出重定向到标准输出。

nc -zv <my url> 5000-5010 2>&1 | grep -m 1 failed

获取失败的行。

参见 http://www.cyberciti.biz/faq/redirecting-stderr-to-stdout/

顺便说一下,我建议您使用awk从输出行中获取端口号:

nc -zv <my url> 5000-5010 2>&1 | grep -m 1 failed | awk '{print $6}'

该命令打印输出行中第6列的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接