我尝试使用此命令尝试查找未使用的端口。我想要它做的是在一系列端口上运行netcat,找到那些没有运行服务的端口,grep这些输出行中的第一行,然后使用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'
我什么都没得到,即使大多数输出行包含单词失败。
通过手册页显示netcat -z仅返回输出以获得成功结果,但为什么我的终端窗口上出现一行又一行的连接失败仍然超出我的范围。
如何使用netcat查看连接失败的第一个端口?
答案 0 :(得分: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
超时
如果连接和stdin空闲超过超时秒数,则会以静默方式关闭连接。 -w标志对-l选项没有影响,即nc将永远监听连接,有或没有-w标志。默认为无超时。
资源
答案 1 :(得分:1)
nc -v
命令将失败/成功消息写入标准错误,而不是标准输出。您可以使用2>&1
将stderr重定向到标准输出。
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列中的值。