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