检查远程主机上一个端口的状态

我需要一个可以检查远程主机端口状态的命令行。我试过 ping xxx.xxx.xxx.xxx:161,但它不能识别“主机”。我认为这是一个“好”的答案,直到我对一个我知道已经打开了端口的主机执行了相同的命令。这是 Windows 上的一个批处理文件,它将检查远程端口的状态,然后运行一个使用该远程端口获取信息的命令,然后再次运行远程端口检查命令,然后运行在下一个服务器上使用该端口获取信息的命令,依此类推。我已经找遍了所有地方,并且认为 ping 可能会做到这一点,但是一定有各种各样的 ping 版本,我假设我在做这件事的服务器上没有显示这个选项。

只是为了好笑,我尝试了一个基于 Web 的远程端口检查器从一个网站-和结果都是正确的“问题”服务器和正确的服务器。但是,我不能在一个包含500多个服务器 IP 的批处理运行中使用它。

我能做点简单的事吗?我的 Perl 技能非常生疏(使用它或丢失它) ,不知道任何其他基于 Windows 的语言,除了批处理。Unix 是我的技能,但这必须从 WidowsServer2003执行。

709189 次浏览

我认为你在寻找 Hping (http://www.hping.org/) ,它有一个 Windows 版本。

”界面的灵感来源于 Ping (8) unix 命令,但 hping 不是 只能发送 ICMP 回声请求。 它支持 TCP,UDP,ICMP...”

如果您希望查看 TCP 端口在路由的哪个位置被阻塞(比如被防火墙阻塞) ,ICMP 可能不在这个位置,那么它也非常有用。

您似乎正在寻找端口扫描器,如 NmapNetcat,这两者都可用于 Windows、 Linux 和 Mac OS X。

例如,检查已知 ip 上的 telnet:

nmap -A 192.168.0.5/32 -p 23

例如,在 host.example.com 上寻找20到30个开放的端口:

nc -z host.example.com 20-30

Nc 或“ netcat”也有一个扫描模式,这可能是有用的。

在命令提示符中,您可以使用命令 telnet. 。 例如,要使用端口80连接到 IP 192.168.10.1,

telnet 192.168.10.1 80

在 Windows7及以上 点击中启用 telnet。在链接的文章中,通过控制面板-> 程序和特性-> 窗口特性-> telnet 客户端启用 telnet,或者在管理提示中运行它:

dism /online /Enable-Feature /FeatureName:TelnetClient

Windows + RcmdEnter

在命令提示符中键入

telnet "machine name/ip" "port number"

如果端口未打开,将显示以下信息:

"Connecting To "machine name"...Could not open connection to the host, on port "port number":

否则您将被带入打开的端口(将显示空白屏幕)

使用 nc 命令,

nc -zv <hostname/ip> <port/port range>


For example,
nc -zv localhost 27017-27019
or
nc -zv localhost 27017

您还可以使用 telnet 命令

telnet <ip/host> port

出于编写脚本的目的,我发现 curl命令可以做到这一点,例如:

$ curl -s localhost:80 >/dev/null && echo Connected. || echo Fail.
Connected.
$ curl -s localhost:123 >/dev/null && echo Connected. || echo Fail.
Fail.

也许它并不适用于所有服务,因为 curl在某些情况下可以返回不同的错误代码(根据注释) ,所以添加以下条件可以可靠地工作:

[ "$(curl -sm5 localhost:8080 >/dev/null; echo $?)" != 7 ] && echo OK || echo FAIL

注意: 增加 -m5设置最大连接超时5秒。

如果您还想检查主机是否有效,您还需要检查 6退出代码:

$ curl -m5 foo:123; [ $? != 6 -a $? != 7 ] && echo OK || echo FAIL
curl: (6) Could not resolve host: foo
FAIL

要对返回的错误代码进行故障排除,只需运行: curl host:port,例如:

$ curl localhost:80
curl: (7) Failed to connect to localhost port 80: Connection refused

请参阅: man curl了解完整的出口代码列表。

在 Bash 中,可以使用伪设备文件,这些文件可以打开到相关套接字的 TCP 连接。语法是 /dev/$tcp_udp/$host_ip/$port

下面是测试 Memcached 是否正在运行的简单示例:

</dev/tcp/localhost/11211 && echo Port open || echo Port closed

下面是另一个测试,看看特定的网站是否可以访问:

$ echo "HEAD / HTTP/1.0" > /dev/tcp/example.com/80 && echo Connection successful.
Connection successful.

更多信息,请查看: 高级 Bash 脚本指南: 第29章 ABC0和 /proc

相关: 测试是否可以访问远程系统上的端口(不使用 telnet) at SuperUser。

有关更多示例,请参见: 如何在 bash shell 中打开 TCP/UDP 套接字(文章)。