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


158

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

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

我能做些简单的事情吗?我的Perl技能非常生锈(使用或丢失),除了批处理之外,不了解其他基于Windows的语言。Unix是我的技能,但是必须从Widows Server 2003中执行。


5
你可能想试着问这个在serverfault.com
约翰·拉什


1
由于这个问题已经关闭,我已经在这里
npocmaka


窗户 ps> tnc xxx.xxx.xxx.xxx -port 161
Moslem Shahsavan

Answers:


151

您似乎正在寻找端口扫描程序,例如nmapnetcat,它们都可用于Windows,Linux和Mac OSX。

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

nmap -A 192.168.0.5/32 -p 23

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

nc -z host.example.com 20-30

这两个都可用于Windows。
格伦

1
您的nmap命令应为实数“ -p23”,且不带空格。nmap将没有紧随其后的每个单元视为单独的扫描目标
Brandon Lebedev 2015年

14
应该是nc -zv host.example.com 20-30。否则没有输出
Aryeh Beitz

1
该选项-znc不可用在Linux上。
valentin_nasta

1
@valentin_nasta是的,可能取决于您使用的是哪个版本的netcat(gnu或openbsd)。这是Arch Linux系统上nc(openbsd版本)的手册页上的相关行:-z指定nc应该只扫描侦听的守护程序,而不向它们发送任何数据。将此选项与-l选项一起使用是错误的
pgoetz

126

在命令提示符下,可以使用命令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

3
如果在Windows设备上安装了telnet,这是最简单的方法
shonky linux用户2013年

30
...并将其添加到Windows需要2秒(在我的情况下为8.1)>控制面板>添加程序>打开Windows功能
Chris Moutray 2014年

14
仅供参考:如果端口未打开:连接至##### ...无法打开与主机的连接,端口####:连接失败;如果端口打开,您将进入telnet(CTRL +],然后单击“退出”)
blackstrype 2015年

27

出于脚本目的,我发现该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上)。
Mike Atlas

1
定制服务。FWIW的工作原理如下:curl $IP:$PORTyields :(curl: (52) Empty reply from server相对于curl: (7) Failed to connect),但很像nc,我不能| grep Empty像人们期望的那样输出这些输出语句(关于换行符还是缺少立即输出?)。我认为您的行是基于退出代码的条件代码,对吗?我在El Cap;也许在其他版本或操作系统中,失败状态-1而不是退出52
Mike Atlas

是的,可以做到。curl -s $IP:$PORT >/dev/null; if [ $? -eq 52 ]; then echo "Connected."; else echo "Fail."; fi
Mike Atlas

问题是关于Windows的,它显然没有/ dev / null
Arthur Tacca

@ArthurTacca您始终可以将Windows子系统用于Linux(WSL)。
kenorb

23

Windows+ R键入cmdEnter

在命令提示符下键入

telnet "machine name/ip" "port number"

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

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

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


7
请注意,现代Windows系统上默认未安装telnet。您必须从“添加/删除Windows功能”控制面板进行安装。
格雷格

1
@Greg或使用诸如telnet-online.net之类
盎司

2
@oz是的,除非您正在检查内部服务器的状态
Greg

可以在Windows10上使用
gaurav

19

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


2

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

“该接口的灵感来自ping(8)unix命令,但是hping不仅能够发送ICMP回显请求。它还支持TCP,UDP,ICMP ...”

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


2

在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章/dev/proc

相关:测试超级用户是否可以访问远程系统上的端口(没有telnet)

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


1
哇,这是天才!我不知道仅仅用bash就能做到。对于像我这样只在Windows上安装了git bash且不想安装其他服务的人来说,如此方便。
dotlashlashlu 18/07/27
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.