检查远程主机上一个端口的状态[关闭]
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? windowsps> 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 输入 cmd
和 Enter
在命令提示符下输入
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虚拟机的问题,主机无法用远程桌面连接虚拟机,求高手解答