ping特定端口


670

这里只是一个快速的理智检查。

您可以ping机器的特定端口吗?如果可以,请提供示例吗?

我正在寻找类似的东西ping ip address portNum


1
对于Windows,可以检查此问题
npocmaka

Answers:


720

您无法ping端口,因为Ping正在使用没有端口概念的ICMP。端口属于传输层协议,例如TCP和UDP。但是,您可以使用nmap查看端口是否打开

nmap -p 80 example.com

编辑:正如flokra所提到的,nmap不仅仅是ping-for-ports-thingy。它是安全审核员和黑客最好的朋友,并提供许多不错的选择。检查文档中所有可能的标志。


15
您可能想要添加-PN以跳过nmap在测试给定端口之前通常执行的主机发现。
flokra

27
为了省去一些麻烦:nmap /可以通过链接(或google nmap windows)安装在Windows上,但是它不能通过VPN使用。PaPing似乎无法扫描一定范围的地址。我在下面发布了Python脚本,该脚本将通过VPN扫描一系列地址上的一系列端口。

23
对于其他:nmap在Mac OS X上不存在,您可以通过自制软件brew install nmap或MacPorts 安装nmap 。
生命之路

17
nmap比nmap更适合此任务。nping是nmap分布的一部分。
CMCDragonkai 2014年

6
Mac OSX的“网络实用程序”具有端口扫描程序选项卡
Shanimal

191

打开到特定端口的telnet会话,例如:

# telnet google.com 80
Trying 74.125.226.48...
Connected to google.com.
Escape character is '^]'.

要结束会话,请点击Ctrl+ ]


23
netcat效果也很好,也不太冗长。
petrus 2011年

3
如果端口是TCP端口,则Telnet可以很好地工作。
Falcon Momot 2013年

6
netcat也可以使用UDP(nc -u)
Tsvetomir Dimitrov

1
对于Mac用户- netcat现在是内置的MacOS HighSierra,其中可以从HomeBrew安装telnetbrew install telnet
sandiejat

98
$ nc -vz google.com 80
Connection to google.com 80 port [tcp/http] succeeded!

10
timelike in 一起使用,time nc -vz www.example.com 80您还将获得某种RTT。
xebeche 2014年

3
无需任何安装即可在Amazon EC2实例上运行的唯一解决方案。
Masadow '16

-z是什么?NCAT 6.40上rhel7赋予它是一个未知的选项
Tagar

@Tagar根据Ubuntu版本中的帮助,-z是Zero-I / O模式,用于扫描。
Ben Mordecai

88

如果您正在使用Powershell v4或更高版本进行Windows安装,则可以使用test-netconnection powershell模块:

Test-NetConnection <host> -port <port>

示例:Test-NetConnection example.com-端口80

此cmdlet也具有别名tnc。例如tnc example.com -port 80


80

您可以使用PaPing:

http://code.google.com/p/paping

C:\>paping.exe www.google.com -p 80 -c 4
paping v1.5.1 - Copyright (c) 2010 Mike Lovell

Connecting to www.l.google.com [209.85.225.147] on TCP 80:

Connected to 209.85.225.147: time=24.00ms protocol=TCP port=80
Connected to 209.85.225.147: time=25.00ms protocol=TCP port=80
Connected to 209.85.225.147: time=24.00ms protocol=TCP port=80
Connected to 209.85.225.147: time=24.00ms protocol=TCP port=80

Connection statistics:
        Attempted = 4, Connected = 4, Failed = 0 (0.00%)
Approximate connection times:
        Minimum = 24.00ms, Maximum = 25.00ms, Average = 24.25ms

1
或者,您可以使用哭声来代替敲打,因为哭声已经存在了很长时间,并且支持对某些服务和端口进行ping操作。

可以用来ping任何端口还是只能ping 80?
路加·普普利特

@LukePuplett仅在示例中更改数字80。通过键入paping.exe运行它<主机名/ IP> -p <端口号> -c <尝试次数>
大卫科斯塔

这很好。使用-c *恒定papinging(?)。
user2924019 17-4-18


26

尝试curl命令,例如:

$ curl host:port

例如:

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

上面的命令将在非零退出状态代码时返回Fail。在某些特殊情况下,例如响应为空或格式错误(请参阅参考资料man curl),您可能希望成功处理特定的退出代码,因此请查看此帖子以获取更多详细说明。


3
我喜欢这个,因为curlCentOS上默认存在它,所以我不需要安装任何东西。
bdemarest

curl在Raspberry Pi(Raspian发行版)上工作
John M

1
到目前为止,这是最优雅,最通用的解决方案。我对其进行了微调,以使其更简洁:IP="<ip>" ; PORT="<port>" ; curl -s "$IP:$PORT" > /dev/null && echo "Success connecting to $IP on port $PORT." || echo "Failed to connect to $IP on port $PORT."
Lefty G Balogh

21

我发现了使用PsPing的更简单的解决方案:

psping 192.168.2.2:5000

它是Windows Sysinternals的一部分。

PsPing实现Ping功能,TCP ping,延迟和带宽测量。


1
另外,PsPing来自Microsoft SysInternal团队,因此在与其他面向Microsoft的人员打交道时,PsPing可能会被认为更加合法。(并且具有比非常老的PortQry更好的功能)
martyvis '18

PSPing的优点是在使用自定义端口时提供延迟测量,这是Test-NetConnection无法完成的(它仅报告ICMP响应时间)。
杰夫·迈尔斯

14

在Linux上,您可以使用hping,但它使用TCP,而不是ICMP。

hping example.com -S -V -p 80

1
hping(在我的ubuntu中为hping3)非常好。它像ping一样定期重复探测,并且与此处建议的许多工具不同。它还测试数据包是否通过以及端口是否打开。如果打开,则得到flags=SA(即SYN ACK),如果关闭,则得到flags=SR(即SYN RST)。请注意,您可能不需要-V此处的标志,但需要sudo / root才能运行hping。
mc0e

优秀的!与许多其他答案不同,它报告RTT延迟,例如pingping直到停止。
爱德华·安德森

11

Ping非常具体,但是如果您要检查端口是否已打开并且正在运行Windows,则PortQry是您的朋友。

我仅将其用于测试域控制器的连接性问题,但是它可以有效地解决此问题,因此应该对您有用。


1
PortQry最初是由MS Exchange团队于1999/2000年发布的,但是MS的最新版本似乎已通过取消查询远程端口的功能(健康与安全)而使其发展受阻。
路加·普普利特

8

这是一个快速又肮脏的.NET控制台应用程序:

    static void Main(string[] args)
    {
        string addressArgument = null, portArgument = null;

        System.Net.Sockets.TcpClient tcpClient = null;

        try
        {
            addressArgument = args[0];
            portArgument = args[1];

            int portNumber;
            portNumber = Int32.Parse(portArgument);

            tcpClient = new System.Net.Sockets.TcpClient();
            tcpClient.ReceiveTimeout = tcpClient.SendTimeout = 2000;


            IPAddress address;
            if (IPAddress.TryParse(args[0], out address))
            {
                var endPoint = new System.Net.IPEndPoint(address, portNumber);
                tcpClient.Connect(endPoint);
            }
            else
            {
                tcpClient.Connect(addressArgument, portNumber);
            }

            Console.WriteLine("Port {0} is listening.", portArgument);
        }
        catch (Exception e)
        {
            if (e is SocketException || e is TimeoutException)
            {
                Console.WriteLine("Not listening on port {0}.", portArgument);
            }
            else
            {
                Console.WriteLine("Usage:");
                Console.WriteLine("    portquery [host|ip] [port]");
            }
        }
        finally
        {
            if (tcpClient != null)
                tcpClient.Close();
        }
    }

5

没有。

不能保证端口上运行的服务可以ping通。它还提出了您要ping端口的“味道”(TCP或UDP)的问题?由于ping“协议”两者都不使用(ping是使用ICMP实现的),因此没有太大意义。


4

我非常确定Nagios的check_tcp探针可以满足您的需求。它们可以在此处找到,尽管设计为在Nagios上下文中使用,但它们都是独立程序。

$ ./check_tcp -H host -p 22
TCP OK - 0.010 second response time on port 22|time=0.009946s;0.000000;0.000000;0.000000;10.000000

4

这是唯一适用于客户端计算机为Windows Vista或Windows 7的VPN的解决方案,因为列出的其他答案根本不起作用。该答案以前已删除,不应删除,因为这是现实世界中常见情况的唯一解决方案。由于无法进行删除,因此我将其重新发布,以免其他人因尝试使用其他答案而感到沮丧。

下面的示例查找在Windows 7上运行的客户端上打开了VNC /端口5900的VPN上的哪些IP。

简短的Python(v2.6.6)脚本,用于扫描给定的IP和端口列表:

from socket import *

fTimeOutSec = 5.0
sNetworkAddress = '192.168.1'
aiHostAddresses = range(1,255)
aiPorts = [5900]

setdefaulttimeout(fTimeOutSec)
print "Starting Scan..."
for h in aiHostAddresses:
    for p in aiPorts:
        s = socket(AF_INET, SOCK_STREAM)
        address = ('%s.%d' % (sNetworkAddress, h))
        result = s.connect_ex((address,p))
        if ( 0 == result ):
            print "%s:%d - OPEN" % (address,p)
        elif ( 10035 == result ):
            #do nothing, was a timeout, probably host doesn't exist
            pass
        else:
            print "%s:%d - closed (%d)" % (address,p,result)

        s.close()
print "Scan Completed."

结果如下:

Starting Scan...
192.168.1.1:5900 - closed (10061)
192.168.1.7:5900 - closed (10061)
192.168.1.170:5900 - OPEN
192.168.1.170:5900 - closed (10061)
Scan Completed.

需要更改顶部的四个变量以适合所需的超时,网络,主机和端口。在我的VPN上停留5.0秒似乎足以使它始终如一地正常工作,更少的时间(始终)未给出准确的结果。在我的本地网络上,0.5绰绰有余。


2
在Win 7 XP Pro客户端/ Win Server 2008 R2上可以完美地诊断关闭的端口。(我必须使用30秒的超时阈值,但这可能是特定服务器环境的问题,而不是此代码的问题)
David Zemens


1

在Bash shell中,可以使用TCP 伪设备文件,例如:

</dev/tcp/serverfault.com/80 && echo Port open || echo Port closed

这是实现1秒超时的版本:

timeout 1 bash -c "</dev/tcp/serverfault.com/81" && echo Port open || echo Port closed

0

如果您正在运行* nix操作系统,请尝试安装和使用“ zenmap”,它是nmap的GUI,并且具有几个有用的扫描配置文件,这对新用户很有帮助。


Zenmap也可用于Windows。
尼克·扬
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.