如何用bashtesting一个Internet连接?
如何在不ping通某个网站的情况下testing互联网连接? 我的意思是,如果有一个连接,但该网站已closures? 有没有检查与世界的联系?
ping www.google.com ping www.yahoo.com ping www.facebook.com ping www.stackoverflow.com
这样做,你可以肯定:)
Ping您的默认网关:
#!/bin/bash ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error
没有平
#!/bin/bash wget -q --spider http://google.com if [ $? -eq 0 ]; then echo "Online" else echo "Offline" fi
-q :静音模式
– 蜘蛛 :没有得到,只是检查页面的可用性
$? :shell返回码
0 :shell“All OK”代码
没有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
超级感谢用户提出他们的职位在这里: https ://bbs.archlinux.org/viewtopic.php?id = 55485在2008-09-20 02:09:48
在/ sys / class / net中查找应该是一种方法
这是我的脚本来testing一个networking连接,而不是循环回来。 我在另一个脚本中使用下面的脚本,以定期testing我的网站是否可以访问。 如果无法访问,popup窗口会提醒我一个问题。
下面的脚本阻止我每隔五分钟收到popup消息,只要我的笔记本没有连接到networking。
#!/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'语句testing如果不是[!]在线并退出,如果是这样的话。 看到人bash和search“expression式可能结合”了解更多细节。
PS我觉得ping不是最好的东西在这里使用,因为它的目的是testing一个特定主机的连接,而不是testing是否有连接到任何types的networking 。
PPS以上在Ubuntu 12.04上运行/ sys可能不存在于其他一些发行版中。 见下文:
现代Linux发行版包含一个/ sys目录作为虚拟文件系统(sysfs,可与/ proc比较,这是一个procfs),它存储并允许修改连接到系统的设备,而许多传统的UNIX和类Unix操作系统使用/ sys作为内核源码树的符号链接。[引用需要]
从维基百科https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
这适用于Mac OSX和Linux:
#!/bin/bash if ping -c 1 google.com >> /dev/null 2>&1; then echo "online" else echo "offline" fi
我已经编写脚本,只需使用telnet连接到端口80,然后传输文本:
HTTP/1.0 GET /index.html
接着是两个CR / LF序列。
假如你得到某种forms的HTTP响应,你通常可以假设该站点正在运行。
如果您的本地名称服务器closures,
ping 4.2.2.1
是一个容易记住的永远的IP(它实际上是一个名称服务器,甚至)。
平被devise来做你正在做的事情。 但是,如果站点阻塞ICMP回显,则可以始终将telnet执行到某个站点的端口80,wget或curl。
Pong并不意味着服务器上的Web服务正在运行; 它仅仅意味着服务器正在回复ICMP回显。 我会build议使用curl并检查其返回值。
检查Google的索引页是另一种方法:
#!/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
类似于@ Jesse的回答 ,这个选项可能比任何使用ping
解决scheme快得多,也许比@ Jesse的答案稍微有效一些。
find /sys/class/net/ -maxdepth 1 -mindepth 1 ! -name "*lo*" -exec sh -c 'cat "$0"/carrier 2>&1' {} \; | grep -q '1'
Explenation:
这个命令使用find
和-exec
命令在/sys/class/net/
所有非*lo*
文件上运行命令。 这些应该是包含有关机器上可用networking接口信息的目录的链接。
正在运行的命令是一个sh
命令,用于检查这些目录中文件carrier
的内容。 $interface/carrier
的值有3个含义 – 引用 :
看来有三种状态:
- ./载体不可读(例如,在networkingpipe理器中禁用接口时)。
- ./载体包含“1”(当接口被激活并且连接到WiFinetworking时)
- ./载体包含“0”(当接口被激活并且没有连接到WiFinetworking时)
在@ Jesse的回答中 ,第一个选项没有被关注。 sh
命令是:
# Note: $0 == $interface cat "$0"/carrier 2>&1
cat
正被用来检查carrier
的内容,并将所有输出redirect到标准输出,即使它由于文件不可读而失败。 如果grep -q
在这些文件中find"1"
,意味着至less有一个接口连接。 grep -q
的退出代码将是最终的退出代码。
用法
例如,使用这个命令的退出状态,你可以使用它在你的~/.xprofile
启动一个gnubiff ,只有当你有一个互联网连接。
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 &
参考
- 帮助testing
/sys/class/net/
- find一个shell函数?
这个bash脚本连续检查互联网,并在互联网可用时发出哔哔声。
#!/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
更快,输出也更less,缺点是你不得不安装它。
你可以使用任何公共的DNS,而不是一个特定的网站。
fping -q google.com && echo "do something because you're connected!"
-q
返回一个退出代码,所以我只是展示了一个运行你在线的东西的例子。
在mac上安装: brew install fping
; 在Ubuntu上: sudo apt-get install fping
确保您的networking允许TCPstream量进出,然后您可以使用以下命令取回您的面向公众的IP
curl ifconfig.co