如何在不ping网站的情况下测试网络连接?我的意思是,如果网站宕机了,但是有连接怎么办?有没有检查与世界连接的方法?
如何在不ping网站的情况下测试网络连接?我的意思是,如果网站宕机了,但是有连接怎么办?有没有检查与世界连接的方法?
没有ping
#!/bin/bash
wget -q --spider http://google.com
if [ $? -eq 0 ]; then
echo "Online"
else
echo "Offline"
fi
-q:静默模式
--spider:只检查页面是否可用,不获取文件
$?:Shell返回代码
0:Shell“全部正常”代码
没有wget命令
#!/bin/bash
echo -e "GET http://google.com HTTP/1.0\n\n" | nc google.com 80 > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "Online"
else
echo "Offline"
fi
nc
增加超时时间来确保它能够超时。可以使用类似 nc google.com 80 -w 10
的命令。 - kaptanping您的默认网关:
#!/bin/bash
ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error
这适用于MacOSX和Linux两个操作系统:
#!/bin/bash
ping -q -c1 google.com &>/dev/null && echo online || echo offline
ping:invalid option -- w
)之外。 - avishaypfping google.com
或者简单地fping 8.8.8.8
可以神奇地完成任务,而且你还能获得状态码,无需测试它("google.com is alive
")。 - Rogerping -q -t 1 -c 1 google.com &> /dev/null && echo online || echo offline
- sidneys非常感谢用户somedrew在此处发布的帖子:https://bbs.archlinux.org/viewtopic.php?id=55485,时间为2008年9月20日02:09:48。
在 /sys/class/net 目录下查找应该是一种方式。
这是我的脚本,用于测试除回环之外的网络连接。我在另一个脚本中使用它来定期测试我的网站是否可访问。如果无法访问,弹出窗口会提示我有问题。
以下脚本防止我在笔记本电脑未连接到网络时每五分钟接收到弹出消息。
#!/usr/bin/bash
# Test for network conection
for interface in $(ls /sys/class/net/ | grep -v lo);
do
if [[ $(cat /sys/class/net/$interface/carrier) = 1 ]]; then OnLine=1; fi
done
if ! [ $OnLine ]; then echo "Not Online" > /dev/stderr; exit; fi
对于那些刚接触bash的人:最后的“if”语句测试是否没有[!]联网,如果是这种情况则退出。请参阅man bash并搜索“表达式可组合”以获取更多详细信息。
P.S. 我觉得ping不是在这里使用的最好工具,因为它旨在测试与特定主机的连接,而不是测试是否存在任何类型的网络连接。
P.P.S. 上述内容适用于Ubuntu 12.04,/sys可能不存在于其他某些发行版中。请参见下面:
现代Linux发行版包括/sys目录作为虚拟文件系统(sysfs,类似于/proc,它是一个procfs),它存储并允许修改连接到系统的设备,而许多传统的UNIX和类Unix操作系统将/sys用作指向内核源代码树的符号链接。[需要引证]
来自维基百科https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
cat /sys/class/net/$interface/carrier
后面加上 2>/dev/null
,以防网络被禁用时出现错误输出。 - jarnoif : >/dev/tcp/8.8.8.8/53; then
echo 'Internet available.'
else
echo 'Offline.'
fi
(:
是Bash中的无操作指令,因为您只想测试连接,而不做任何处理。)
(译注:这里的“无操作指令”指的是一个没有实际操作的占位符,通常用于在脚本中占位或注释代码。)
timeout 10 true >/dev/tcp/8.8.8.8/53
?(将“:`”改为“true”) - Luchosteintimeout 10 true >/dev/tcp/8.8.8.8/53
对我仍然被阻止,但将整个命令包装在 sh 中,在超时的情况下我们想要杀死它,这样可以解决问题:timeout 10 sh -c "true >/dev/tcp/8.8.8.8/53"
。这样一来,也可以使用 :
替代 true
。 - agostonbarnaping
命令就能更快地完成,不需要那么多的封装。 - undefined最佳答案没有考虑到您可能与默认网关有着完全稳定的连接,但这并不意味着您一定能够实际访问互联网上的某些内容。OP询问如何测试与外界的连接。因此,我建议将顶部答案中的网关IP更改为已知的位于LAN之外的IP(x.y.z.w)。
因此,答案将变为:
ping -q -w 1 -c 1 x.y.z.w > /dev/null && echo ok || echo error
同时移除不受欢迎的反引号用于命令替换[1].
如果你只是想在执行某些代码之前确保已连接到互联网,你也可以使用以下方法:
if ping -q -w 1 -c 1 x.y.z.w > /dev/null; then
# more code
fi
确保您的网络允许 TCP 流量进出,然后可以使用以下命令获取公共 IP 地址:
curl ifconfig.co
执行以下命令以检查网站是否正常运行,以及Web服务器显示的状态消息:
curl -Is http://www.google.com | head -1 HTTP/1.1 200 OK
状态代码“200 OK”表示请求成功,网站可达。
我以前写过一些脚本,只需使用telnet连接到80端口,然后传输文本:
HTTP/1.0 GET /index.html
接着两个CR/LF序列。
如果你收到了HTTP响应的任何形式,通常可以假定该网站正在运行。
最受欢迎的答案对于MacOS无效,因此对于使用Mac的用户,我已经成功测试了以下内容:
GATEWAY=`route -n get default | grep gateway`
if [ -z "$GATEWAY" ]
then
echo error
else
ping -q -t 1 -c 1 `echo $GATEWAY | cut -d ':' -f 2` > /dev/null && echo ok || echo error
fi
在MacOS High Sierra 10.12.6上进行测试。
route
命令更改为 route -n get default 2> /dev/null | grep gateway
,以避免在离线时向 stderr 写入错误。 - devstuff