如何从命令行检查网络是否可达?

如何从命令行检查网络是否可达?

我想在 SuSE 服务器完成启动过程后向自己发送一个咆哮。我收到这个消息socket_sendto(): unable to write to socket [101]: Network is unreachable in

如何从命令行检查网络是否可达并等待,以防网络不可达?


答案1

ping到外部主机的失败可能有多种原因,其中只有少数实际上说明了有关您自己的网络状态的有用信息。

第一步,打开终端窗口并输入 ip route ls

您应该看到类似以下内容的输出

shadur@equinox:~$ ip route ls
192.168.15.0/24 dev eth0  proto kernel  scope link  src 192.168.15.102 
default via 192.168.15.1 dev eth0 

这表明您的本地网络是eth0具有该地址的以太网连接 () 192.168.15.0,并且可以在以下位置找到其访问互联网其余部分的默认网关192.168.15.1

接下来,您可以尝试ping该地址:

shadur@equinox:~$ ping 192.168.15.1
PING 192.168.15.1 (192.168.15.1) 56(84) bytes of data.
64 bytes from 192.168.15.1: icmp_req=1 ttl=255 time=0.352 ms
64 bytes from 192.168.15.1: icmp_req=2 ttl=255 time=0.269 ms
^C
--- 192.168.15.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.269/0.310/0.352/0.045 ms

如果您看到与上述类似的内容,那么您自己的本地网络至少是好的。此时,您可以开始使用更高级的工具进行查找,例如traceroute查看与目标的连接可能在哪里失败。

然而,在谷歌快速检查了growl实际情况后,我感觉还有其他问题。您能否扩展您的问题,为我们提供更多关于您想要做什么、如何尝试以及完整错误输出的详细信息?您目前给我们提供的线路突然被切断......

答案2

一个非常简单快捷的方法是使用ping命令。

您只需输入

 $ ping yahoo.com

(或 cnn.com 或任何其他主机)并查看是否收到任何输出。这假设主机名可以解析(即 dns 正在工作)。如果没有,您可以提供远程系统的有效 IP 地址/编号,看看是否可以访问它。

这是ping 手册页

更新:

作为一个简单的例子,您可以检查返回值(例如,使用"echo $?") from 来ping查看命令是否成功(您始终可以将命令的输出通过管道传输到> /dev/nul)。注意我-c 1在这里使用,但你可以使用更多。

$ ping -c 1 yahoo.com
PING yahoo.com (72.30.38.140) 56(84) bytes of data.
64 bytes from ir1.fp.vip.sp2.yahoo.com (72.30.38.140): icmp_seq=1 ttl=52 time=83.5 ms

--- yahoo.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 83.593/83.593/83.593/0.000 ms

echo $?
0


$ ping -c 1 unicorns.are.here
ping: unknown host unicorns.are.here

$ echo $?
2

答案3

我会使用netcat所需的服务。

例如测试IP端口,成功

> nc -zv 192.168.1.1 80
Connection to 172.26.0.1 80 port [tcp/http] succeeded!

...并且失败了

> nc -zv 192.168.1.1 22
netcat: connect to 172.26.0.1 port 22 (tcp) failed: Connection refused

10秒超时

> nc -zv -w 10 10.0.0.1 80
netcat: connect to 10.0.0.1 port 80 (tcp) timed out: Operation now in progress

答案4

我使用以下函数...它默认为quad9,但您可以传递不同的域。尝试 15 分钟后将超时

wait_for_dns() {

   local fqhn="quad9.net"
   fqhn=${1:-$fqhn}

   printf "waiting"
   for i in {1..15}; do
      local a_record=$(dig +short +time=2 $fqhn)

      if [[ $a_record != '' ]]; then
         printf "\n"
         return 0
      fi

      printf '.'
      sleep 60
   done

   printf "\n"
   return 1
}

相关内容