如何使用bash测试Internet连接?
如何在不ping某个网站的情况下测试internet连接?如何使用bash测试Internet连接?,bash,connection,ping,Bash,Connection,Ping,如何在不ping某个网站的情况下测试internet连接? 我的意思是,如果有连接,但网站关闭了怎么办?是否检查与世界的连接?我以前写过脚本,只需使用telnet连接到端口80,然后传输文本: HTTP/1.0 GET /index.html 然后是两个CR/LF序列 如果返回某种形式的HTTP响应,通常可以假定站点正在运行。如果本地名称服务器关闭 ping 4.2.2.1 平4.2.2.1 是一个易于记忆的始终向上的IP(它实际上是一个名称服务器)。Ping您的默认网关: #!/bin/ba
我的意思是,如果有连接,但网站关闭了怎么办?是否检查与世界的连接?我以前写过脚本,只需使用telnet连接到端口80,然后传输文本:
HTTP/1.0 GET /index.html
然后是两个CR/LF序列
如果返回某种形式的HTTP响应,通常可以假定站点正在运行。如果本地名称服务器关闭 ping 4.2.2.1 平4.2.2.1
是一个易于记忆的始终向上的IP(它实际上是一个名称服务器)。Ping您的默认网关:
#!/bin/bash
ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error
Ping的设计目的正是要做你想做的事情。但是,如果站点阻止ICMP echo,那么您可以始终对某个站点、wget或curl的端口80执行telnet操作。Pong并不意味着服务器上的web服务正在运行;这仅仅意味着服务器正在回复ICMP echo。
我建议使用curl并检查其返回值。Super感谢用户somedrew在这里发布的帖子:on 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”语句将在线测试if NOT[!]并在这种情况下退出。有关更多详细信息,请参阅man bash和搜索“表达式可能被组合”
另外,我觉得ping在这里不是最好的选择,因为它的目的是测试与特定主机的连接,而不是测试是否与任何类型的网络连接
另外,上述在Ubuntu12.04上运行的/sys在其他发行版上可能不存在。见下文:
现代Linux发行版包括一个/sys目录作为虚拟文件系统(sysfs,类似于/proc,它是一个procfs),它存储并允许修改连接到系统的设备,而许多传统的UNIX和类UNIX操作系统使用/sys作为到内核源代码树的符号链接。[需要引用]
来自维基百科
没有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
检查谷歌的索引页面是另一种方法:
#!/bin/bash
WGET="/usr/bin/wget"
$WGET -q --tries=20 --timeout=10 http://www.google.com -O /tmp/google.idx &> /dev/null
if [ ! -s /tmp/google.idx ]
then
echo "Not Connected..!"
else
echo "Connected..!"
fi
这适用于MacOSX和Linux:
#!/bin/bash
ping -q -w1 -c1 google.com &>/dev/null && echo online || echo offline
与此类似,此选项可能比使用ping
的任何解决方案都要快得多,并且可能比其他解决方案的效率略高
解释:
此命令使用find
和-exec
对/sys/class/net/
中未命名的所有文件运行命令。这些应该是指向目录的链接,其中包含有关计算机上可用网络接口的信息
正在运行的命令是一个sh
命令,用于检查这些目录中文件carrier
的内容。$interface/carrier
的值有3种含义-:
似乎有三种状态:
- ./carrier不可读(例如,在网络管理器中禁用接口时)
- /运营商包含“1”(当接口激活并连接到WiFi网络时)
- /运营商包含“0”(当接口激活且未连接到WiFi网络时)
sh
命令是:
# Note: $0 == $interface
cat "$0"/carrier 2>&1
cat
用于检查carrier
的内容,并将所有输出重定向到标准输出,即使由于文件不可读而失败。
如果grep-q
在这些文件中找到“1”
,则表示至少连接了一个接口。grep-q
的退出代码将是最终的退出代码
用法
例如,使用此命令的退出状态,仅当您有internet连接时,才可以在~/.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 &
参考文献
#!/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
更快,输出更详细,缺点是您必须安装它
您可以使用任何网站,而不是特定的网站
fping-qgoogle.com&&echo“做点什么,因为你已经连接了!”
-q
返回一个退出代码,所以我只是展示了一个运行联机内容的示例
要在mac上安装:
brew安装fping
;在ubuntu上:sudo-apt-get-install-fping
确保您的网络允许TCP流量进出,然后您可以使用以下命令恢复面向公众的IP
curl ifconfig.co
执行以下命令以检查网站是否已启动,以及web服务器显示的状态消息:
curl-Ishttp://www.google.com |head-1 HTTP/1.1 200正常
状态代码“200 OK”表示请求已成功,并且可以访问网站。不适用于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上测试,最重要的答案忽略了一个事实,即您可以与默认网关建立完全稳定的连接,但这并不自动意味着您可以在internet上访问某些内容。OP询问他/她如何测试与世界的联系。因此,我建议更改changin的顶部答案
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
ping -q -w 1 -c 1 x.y.z.w > /dev/null && echo ok || echo error
if ping -q -w 1 -c 1 x.y.z.w > /dev/null; then
# more code
fi
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 : >/dev/tcp/8.8.8.8/53; then
echo 'Internet available.'
else
echo 'Offline.'
fi
ping -c1 "8.8.8.8" &>"/dev/null"
if [[ "${?}" -ne 0 ]]; then
echo "offline"
elif [[ "${#args[@]}" -eq 0 ]]; then
echo "online"
fi