如何在不使用 ping 的情况下确定机器是否在线?

cop*_*152 18 ping

我曾经使用一个应用程序,它可以 ping 或者在机器上运行端口扫描,即使机器被配置为不允许它。

我目前正在尝试 ping WAN 上的远程机器,但我已将机器配置为不允许 ping。我可以使用类似于 ping 的东西吗?

同样,这是一台位于另一个城市的机器,它是我们广域网的一部分。

Bre*_*nt 18

您可以 telnet 到机器上打开的 tcp 端口。例如,如果机器是 Web 服务器,并且打开了端口 80,则只需:

telnet ip.ad.dre.ss 80
Run Code Online (Sandbox Code Playgroud)

这甚至可以在加密端口上工作(尽管您将无法理解数据)

要尝试的其他一些端口是:

  • 443 用于 https 服务器
  • 22 为 ssh

(Linux 机器上的/etc/services 中有一个端口/服务列表)


Dav*_*ala 17

对容器有用的答案

Ping 是 ICMP,如果您阻止了 ICMP,则无法 ping。

如果您接受 TCP/UDP 连接,您可能仍然能够测试 TCP 或 UDP 端口。

如果您在缺少 ping、nc、telnet 和其他工具的容器上运行测试,您可以使用以下技巧:

(echo >/dev/tcp/${host}/${port}) &>/dev/null && echo "open" || echo "closed"
Run Code Online (Sandbox Code Playgroud)

这将尝试通过设备通过 tcp/udp 进行连接(哇,我知道)并在端口打开时回显“打开”或如果端口关闭则回显“关闭”。

在这种情况下,它会在回显“关闭”之前挂起一段时间。

  • 很酷,我不得不在 docker pod 中使用它;-) (2认同)

mrT*_*awk 4

如果您使用 XP/2003+(包括 Vista/2008/7),那么您可以使用Win32_PingStatus。运行脚本代码的机器是唯一需要 XP/2003+ 的系统,它的工作方式就像使用 Ping.exe 一样,只是它不使用 ping.exe,所以它应该成为您的安全设置的漏洞。不允许执行 ping.exe。

strComputer = "192.168.1.1"
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery _
    ("Select * from Win32_PingStatus " & _
        "Where Address = '" & strComputer & "'")
For Each objItem in colItems
    If objItem.StatusCode = 0 Then 
        WScript.Echo "Reply received."          
    End If
Next
Run Code Online (Sandbox Code Playgroud)

有关如何使用 Win32_PingStatus 的更多信息,请参阅脚本专家文章:

http://www.microsoft.com/technet/scriptcenter/resources/qanda/sept04/hey0914.mspx

  • 我的理解是远程主机已配置为不响应 ICMP Echo 请求数据包,而不是本地主机上的 ping.exe 已被禁用。因此,这与运行 ping.exe 不会做任何不同的事情,也就是说,什么也没有。 (3认同)