Answers:
没有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
Ping您的默认网关:
#!/bin/bash
ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error
function ping_gw() { ... && return 0 || return 1 }
然后按如下方式使用:ping_gw || (echo "no network, bye" && exit 1)
ifconfig down wlan0
并且我仍然具有默认网关,并且可以ping通,即使实际上我无法访问外界。
超级感谢用户somedrew在这里发布的帖子:https://bbs.archlinux.org/viewtopic.php?id = 55485于2008-09-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'语句在线测试NOT [!],如果不是,则退出。请参阅man bash并搜索“表达式可以合并”以了解更多详细信息。
PS:我觉得ping并不是在这里使用的最佳方法,因为它的目的是测试与特定主机的连接,而不是测试是否与任何类型的网络都有连接。
PPS以上内容可在Ubuntu 12.04上使用。/ sys在其他发行版中可能不存在。见下文:
现代Linux发行版包括/ sys目录作为虚拟文件系统(sysfs,相当于/ proc,后者是procfs),该目录存储并允许修改连接到系统的设备,而许多传统的UNIX和类似Unix的操作系统使用/ sys作为指向内核源代码树的符号链接。[需要引用]
从维基百科https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
cat /sys/class/net/wwan0/carrier
没有在Ubuntu 14.04 LTS工作。
2>/dev/null
以后cat /sys/class/net/$interface/carrier
的情况下,网络已禁用于没有错误输出。
在此之前,我已经编写了脚本,只需使用telnet连接到端口80,然后传输文本即可:
HTTP/1.0 GET /index.html
随后是两个CR / LF序列。
如果您获得了某种形式的HTTP响应,则通常可以假定该站点正在运行。
最重要的答案是,您可以与默认网关建立完全稳定的连接,但这并不意味着您实际上可以在Internet上访问某些东西。OP询问他/她如何测试与世界的联系。因此,我建议通过将网关IP更改为LAN之外的已知IP(xyzw)来更改最佳答案。
因此答案将变为:
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
执行以下命令以检查网站是否已启动以及该Web服务器显示的状态消息:
$ curl -Is http://www.google.com |
head -1 HTTP/1.1 200 OK
状态码“ 200 OK”表示请求成功,并且可以访问网站。
curl -Is http://www.google.com | head -1 | grep 200; if [[ $? -eq 0 ]]; then; echo "Online"; else; echo "Offline"; fi;
该顶部投票答案因此对于那些在Mac上,我已经成功地测试了这并不适用于MacOS的工作:
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。
此bash脚本不断检查Internet,并在Internet可用时发出提示音。
#!/bin/bash
play -n synth 0.3 sine 800 vol 0.75
while :
do
pingtime=$(ping -w 1 8.8.8.8 | grep ttl)
if [ "$pingtime" = "" ]
then
pingtimetwo=$(ping -w 1 www.google.com | grep ttl)
if [ "$pingtimetwo" = "" ]
then
clear ; echo 'Offline'
else
clear ; echo 'Online' ; play -n synth 0.3 sine 800 vol 0.75
fi
else
clear ; echo 'Online' ; play -n synth 0.3 sine 800 vol 0.75
fi
sleep 1
done
最短的方法:fping 4.2.2.1
=>“ 4.2.2.1还活着”
我喜欢它,因为它比更快,更详细的输出ping
,缺点是您必须安装它。
您可以使用任何公共DNS,而不是特定的网站。
fping -q google.com && echo "do something because you're connected!"
-q
返回退出代码,因此我仅显示一个运行您在线的示例。
要在Mac上安装:brew install fping
; 在ubuntu上:sudo apt-get install fping
与@Jesse的答案类似,此选项可能比使用@Jesse的答案的任何解决方案都快得多,ping
并且效率可能稍高。
find /sys/class/net/ -maxdepth 1 -mindepth 1 ! -name "*lo*" -exec sh -c 'cat "$0"/carrier 2>&1' {} \; | grep -q '1'
此命令find
与with -exec
一起使用,可对未*lo*
在中命名的所有文件运行命令/sys/class/net/
。这些应该是指向目录的链接,这些目录包含有关计算机上可用网络接口的信息。
正在运行的sh
命令是检查carrier
那些目录中文件内容的命令。的值$interface/carrier
具有3个含义- 引用:
似乎有三种状态:
- ./carrier不可读(例如,在网络管理器中禁用接口时)。
- ./carrier包含“ 1”(激活接口并将其连接到WiFi网络时)
- ./carrier包含“ 0”(当接口被激活并且未连接到WiFi网络时)
@Jesse的答案未考虑第一个选项。sh
条带化的命令是:
# Note: $0 == $interface
cat "$0"/carrier 2>&1
cat
用来检查的内容carrier
并将所有输出重定向到标准输出,即使由于文件不可读而导致失败时也是如此。如果在这些文件中grep -q
找到"1"
它,则意味着至少连接了1个接口。的退出代码grep -q
将是最终的退出代码。
例如,使用此命令的退出状态,你可以用它启动gnubiff你~/.xprofile
只有当你有互联网连接。
online() {
find /sys/class/net/ -maxdepth 1 -mindepth 1 ! -name "*lo*" -exec sh -c 'cat "$0"/carrier 2>&1 > /dev/null | grep -q "1" && exit 0' {} \;
}
online && gnubiff --systemtray --noconfigure &
如果您的目标是实际检查Internet访问,则该问题的许多现有答案都是有缺陷的。您应该注意的几件事:
考虑到这一点,我认为最好的策略是联系多个通过HTTPS连接站点,如果其中任何一个站点响应,则返回true。
例如:
connected_to_internet() {
test_urls="\
https://www.google.com/ \
https://www.microsoft.com/ \
https://www.cloudflare.com/ \
"
processes="0"
pids=""
for test_url in $test_urls; do
curl --silent --head "$test_url" > /dev/null &
pids="$pids $!"
processes=$(($processes + 1))
done
while [ $processes -gt 0 ]; do
for pid in $pids; do
if ! ps | grep "^[[:blank:]]*$pid[[:blank:]]" > /dev/null; then
# Process no longer running
processes=$(($processes - 1))
pids=$(echo "$pids" | sed --regexp-extended "s/(^| )$pid($| )/ /g")
if wait $pid; then
# Success! We have a connection to at least one public site, so the
# internet is up. Ignore other exit statuses.
kill -TERM $pids > /dev/null 2>&1 || true
wait $pids
return 0
fi
fi
done
# wait -n $pids # Better than sleep, but not supported on all systems
sleep 0.1
done
return 1
}
用法:
if connected_to_internet; then
echo "Connected to internet"
else
echo "No internet connection"
fi
有关此方法的一些注意事项:
if wait $pid;
。不知道为什么这在您的系统上不起作用。确定要使用bash吗?
wait
,现在了解了返回代码确实正在测试中。我重新复制了您的代码,今天它可以工作了-糟糕!上次我一定搞砸了,尽管我不明白是什么或如何。尽管如此,Mea culpa。道歉。
这明显比此处发布的任何解决方案都要快,并且可以用于测试特定主机。
诀窍是使用比以下人员少用的DNS解析器来解决IP ping
:
validateConnection () {
host="${1}"
ip=$(getent ahostsv4 "${host}" | awk '{ print $1 }' | head -n1)
ping -c1 "${ip}" 2>&1 >"/dev/null"
if [ "${?}" -ne 0 ]; then
echo "No connection to: ${host}" >&2
exit 1
fi
}