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

Windows 检查远程主机上一个端口的状态,windows,batch-file,tcp,cmd,Windows,Batch File,Tcp,Cmd,我需要一个命令行,可以检查远程主机上的端口状态。我尝试了ping xxx.xxx.xxx.xxx:161,但它无法识别“主机”。我认为这是一个“好”的答案,直到我对一个我知道该端口已打开的主机执行了相同的命令。这适用于Windows上的批处理文件,该批处理文件将检查远程端口的状态,然后运行使用该远程端口获取信息的命令,然后再次运行远程端口检查命令,然后在下一台服务器上运行使用该端口获取信息的命令,依此类推。我到处都找过了,认为ping可以做到这一点,但肯定有各种版本的ping,我想我正在做这件事

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

为了好玩,我在一个网站上尝试了一个基于web的远程端口检查器,结果对“有问题”的服务器和正确的服务器都是正确的。但是,我不能在500多个服务器IP的批量运行中使用它


我能做些简单的事情吗?我的Perl技能非常生疏(要么使用,要么丢掉),除了batch之外,我不知道任何其他基于Windows的语言。Unix是我的技能,但这必须从Widows Server 2003执行

我想您正在寻找Hping(),它有Windows版本

“界面的设计灵感来自 ping(8)unix命令,但hping不是 只能发送ICMP回显请求。 它支持TCP、UDP、ICMP…”


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

您似乎正在寻找一个端口扫描程序,如或,这两个都适用于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
在Windows 7及更高版本中启用telnet。从链接的文章中,通过控制面板->程序和功能->windows功能->telnet客户端启用telnet,或者在管理员提示下运行:

dism /online /Enable-Feature /FeatureName:TelnetClient
按Windows+R键入
cmd
并输入

在命令提示符类型中

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
nc-zv
例如
nc-zv本地主机27017-27019
或
nc-zv本地主机27017
您也可以使用telnet命令

telnet <ip/host> port
telnet端口

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

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

$ 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\u udp/$host\u ip/$port

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

</dev/tcp/localhost/11211 && echo Port open || echo Port closed
有关详细信息,请检查:

相关:在超级用户



有关更多示例,请参阅:(文章)。

您可能希望尝试在serverfault.com上询问此问题。有人已经这样做了:由于此问题已结束,我已回答PowerShell:windows
ps>tnc xxx.xxx.xxx.xxx-port 161
这两个选项都适用于windows。您的nmap命令应为real“-p23”,不带空格。nmap将每个未紧跟在标志前面的单元视为单独的扫描目标,应为
nc-zv host.example.com 20-30
。否则没有输出
-z
用于
nc
的选项在Linux上不可用。@valentin_nasta是的,可能是,这取决于您使用的netcat版本(gnu或openbsd)。下面是我的Arch linux系统上nc(openbsd版本)手册页中的相关行:-z指定nc应该只扫描侦听的守护进程,而不向它们发送任何数据。将此选项与-l选项一起使用是一个错误。如果Windows设备上安装了telnet,则这是最简单的方法。。。将其添加到windows(在我的例子中是8.1)>控制面板>添加程序>打开windows功能只为获取信息:如果端口未打开:连接到#####…无法打开到主机的连接,在端口#####:连接失败;如果端口是打开的,您将在Mac“nc-zv服务器端口范围”上的telnet(CTRL+],然后“退出”)中结束。不幸的是,这对我不起作用(至少在OS X中的bash上是这样)。这是一个自定义服务。FWIW它是如何工作的:
curl$IP:$PORT
产生:
curl:(52)服务器的空回复(与
curl:(7)连接失败
)但与
nc
非常相似,我不能
| grep Empty
像人们所期望的那样输出语句(关于换行或缺少即时输出?)。我想你的行是基于退出代码的条件行,对吧?我在El Cap上;可能在其他版本或操作系统中,故障状态会退出
-1
,而不是
52
?是的,这样就可以了<代码>curl-s$IP:$PORT>/dev/null;如果[$?-等式52];然后回显“已连接”;否则,我会回应“失败”;fi
问题是关于Windows的,它显然没有例如/dev/null@ArthurTacca您可以始终使用Windows Linux子系统(WSL)。请注意,telnet在现代Windows系统上默认不安装。您必须从“添加/删除Windows功能”控制面板安装它。@Greg或usin
$ echo "HEAD / HTTP/1.0" > /dev/tcp/example.com/80 && echo Connection successful.
Connection successful.