检查远程主机上一个端口的状态[关闭]

Posted

技术标签:

【中文标题】检查远程主机上一个端口的状态[关闭]【英文标题】:Check status of one port on remote host [closed] 【发布时间】:2010-11-13 04:33:45 【问题描述】:

我需要一个命令行来检查远程主机上的端口状态。我试过ping xxx.xxx.xxx.xxx:161,但它无法识别“主机”。我认为这是一个“好”的答案,直到我对我知道该端口打开的主机执行相同的命令。这是用于 Windows 上的批处理文件,它将检查远程端口的状态,然后运行使用该远程端口获取信息的命令,然后再次执行远程端口检查命令,然后运行使用下一个服务器上的该端口获取信息的命令, 等等。我到处寻找,并认为 ping 可能会执行此操作,但必须有各种版本的 ping,我想我正在执行此操作的服务器没有显示该选项。

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

有什么我可以做的简单的事情吗?我的 Perl 技能非常生疏(使用它或失去它),除了批处理之外不知道任何其他基于 Windows 的语言。 Unix 是我的技能,但必须从 Widows Server 2003 执行。

【问题讨论】:

您可能想尝试在 serverfault.com 上询问此问题 有人已经这样做了:serverfault.com/questions/309357/ping-a-specific-port 这个问题已经结束,我已经回答了here PowerShell:How to check if port is open on a remote server with batch file and without third party software? windows ps> tnc xxx.xxx.xxx.xxx -port 161 【参考方案1】:

您似乎正在寻找诸如nmap 或netcat 之类的端口扫描程序,它们都适用于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

【讨论】:

这两个都适用于 Windows。 你的nmap命令应该是真正的“-p23”,没有空格。 nmap 将每个前面没有紧跟标志的单元视为单独的扫描目标 应该是nc -zv host.example.com 20-30。否则没有输出 -z 的选项 nc 在 Linux 上不可用。 @valentin_nasta 是的,可能取决于您使用的 netcat 版本(gnu 或 openbsd)。这是我的 Arch linux 系统上 nc(openbsd 版本)手册页中的相关行: -z 指定 nc 应该只扫描监听守护程序,而不向它们发送任何数据。将此选项与 -l 选项结合使用是错误的【参考方案2】:

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

telnet 192.168.10.1 80

在 Windows 7 及更高版本click 中启用远程登录。从链接的文章中,通过控制面板 -> 程序和功能 -> Windows 功能 -> telnet 客户端启用 telnet,或者只是在管理员提示符下运行:

dism /online /Enable-Feature /FeatureName:TelnetClient

【讨论】:

如果Windows设备上安装了telnet,这是最简单的方法 ... 将其添加到 windows 需要 2 秒(在我的情况下为 8.1)> 控制面板 > 添加程序 > 打开 windows 功能 仅供参考:如果端口未打开:Connecting To #####...Could not open connection to the host, on port ####: Connect failed ;如果端口是开放的,你最终会进入 telnet (CTRL+] 然后 'quit')【参考方案3】:

出于脚本目的,我发现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

【讨论】:

不幸的是,这对我不起作用(至少在 OS X 中的 bash 上)。 自定义服务。 FWIW 它有点工作:curl $IP:$PORT 产生:curl: (52) Empty reply from server(相对于curl: (7) Failed to connect)但很像nc,对于这些输出语句,我不能| grep Empty,就像人们可能期望的那样(关于换行符或缺少立即输出?)。我认为您的行是基于退出代码的条件,对吗?我在 El Cap;也许在其他版本或操作系统中,失败状态退出 -1 而不是 52 是的,可以。 curl -s $IP:$PORT >/dev/null; if [ $? -eq 52 ]; then echo "Connected."; else echo "Fail."; fi 问题是关于 Windows,它显然没有例如/dev/null @ArthurTacca 您始终可以使用适用于 Linux 的 Windows 子系统 (WSL)。【参考方案4】:

Windows + R 输入 cmdEnter

在命令提示符下输入

telnet "machine name/ip" "port number"

如果端口未打开,将显示此消息:

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

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

【讨论】:

请注意,现代 Windows 系统默认不安装 telnet。您必须从“添加/删除 Windows 功能”控制面板安装它。 @Greg 或使用在线工具,例如 telnet-online.net @o.z true,除非您正在检查内部服务器的状态 适用于 Windows10【参考方案5】:

使用 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

【讨论】:

【参考方案6】:

nc 或 'netcat' 也有可能使用的扫描模式。

【讨论】:

在 Mac 上“nc -zv 服务器端口范围”【参考方案7】:

我认为您正在寻找具有 Windows 版本的 Hping (http://www.hping.org/)。

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

如果您想查看 TCP 端口被阻止(例如被防火墙)沿路由的哪个位置,而 ICMP 可能没有被阻止,这也非常有用。

【讨论】:

【参考方案8】:

在 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.

更多信息,请查看:Advanced Bash-Scripting Guide: Chapter 29. /dev and /proc

相关:Test if a port on a remote system is reachable (without telnet) 在 SuperUser。

有关更多示例,请参阅:How to open a TCP/UDP socket in a bash shell(文章)。

【讨论】:

哇,这真是天才!我不知道仅使用 bash 就可以做到这一点。对于像我这样只在 Windows 上安装了 git bash 并且不想安装其他服务的人来说非常方便。

以上是关于检查远程主机上一个端口的状态[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何检测(远程)主机上的某个端口是不是开启

如何检测远程主机上的某个端口是不是开启

使用secureCRT远程Linux,出现远程主机拒绝连接。

关于VMware虚拟机的问题,主机无法用远程桌面连接虚拟机,求高手解答

使用远程主机的 USB 端口作为本地 USB(Linux 和 Windows)[关闭]

使用远程主机的 USB 端口作为本地 USB(Linux 和 Windows)[关闭]