如何用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