如何從命令列檢查網路是否可達?

如何從命令列檢查網路是否可達?

我想在 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
}

相關內容