在工作中,基础架构团队正在推出安装了 RHEL7 作为基础操作系统的新虚拟机。此特定映像附带nmap-ncat
Netcat 版本,但未安装 NMap。我们无法在机器上安装任何东西。
之前,我们使用 GNU Netcat,它可以-z
扫描远程主机/端口以检查其是否打开。如下所示:
nc -z -v -w 3 remote.host.name 1234
我怎样才能使用在无法安装的系统上ncat
没有该选项的新产品实现相同的检查?-z
nmap
答案1
Bash 允许你通过重定向到特殊文件来连接到 TCP 和/或 UDP 端口:
/dev/tcp/host/port
如果 host 是有效的主机名或 Internet 地址,并且 port 是整数端口号或服务名称,则 Bash 将尝试打开相应的 TCP 套接字。
/dev/udp/host/port
如果 host 是有效的主机名或 Internet 地址,并且 port 是整数端口号或服务名称,则 Bash 将尝试打开相应的 UDP 套接字。打开或创建文件失败会导致重定向失败。
因此,要测试您是否可以连接到 www.example.com 上的端口 80,请执行以下操作:
echo -n > /dev/tcp/www.example.com/80
如果端口被阻止,您将收到“连接被拒绝”消息或超时。
答案2
尽管 Ncat 尚不支持-z
,但您可以通过 shell 重定向获得相同的行为:
$ ncat google.com 80 </dev/null >/dev/null && echo "yes"
yes
$ ncat google.com 81 </dev/null >/dev/null && echo "yes"
Ncat: Connection timed out.
$ ncat scanme.nmap.org 1234 </dev/null >/dev/null && echo "yes"
Ncat: Connection refused.
可以使用选项调整连接超时-w
。
编辑:Ncat 7.25BETA2引入了-z
与 GNU netcat 一样的选项,但只适用于单个端口。如果您需要扫描端口范围,则应该使用 Nmap。
答案3
不需要 netcat、telnet 或 nmap。Bash 更简单、可移植且更高效。
打开支票
(>/dev/tcp/example.com/80) &>/dev/null && echo "Open"
开/闭支票
(>/dev/tcp/example.com/80) &>/dev/null && echo "Open" || echo "Closed"
端口范围检查
for i in $(seq 80 88); do (>/dev/tcp/example.com/80/$i) &>/dev/null && echo $i Open|| echo $i Closed; done