如何使用bash测试Internet连接?

lau*_*iys 98 connection bash ping

如何在不ping某些网站的情况下测试互联网连接?我的意思是,如果有连接但网站已关闭怎么办?有检查与世界的联系吗?

use*_*968 118

没有ping

#!/bin/bash

wget -q --spider http://google.com

if [ $? -eq 0 ]; then
    echo "Online"
else
    echo "Offline"
fi
Run Code Online (Sandbox Code Playgroud)

-q:静音模式

- 蜘蛛:不要,只检查页面可用性

$?:shell返回代码

0:shell"一切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
Run Code Online (Sandbox Code Playgroud)

  • 试试这个:echo -e"获取http://google.com HTTP/1.0 \n \n"| nc google.com 80>/dev/null 2>&1 (5认同)
  • 非常好......但当然假设盒子有wget.嵌入式设备,可能不会.;) (2认同)
  • @user3439968 您需要为“nc”添加超时以确保它超时。类似于“nc google.com 80 -w 10” (2认同)
  • 可以使用纯 Bash 来解决 /sf/answers/3929674731/ (2认同)

mat*_*sza 90

Ping您的默认网关:

#!/bin/bash
ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error
Run Code Online (Sandbox Code Playgroud)

  • 好的技术,它可以修改为在函数中使用:`function ping_gw(){... && return 0 || 返回1}`然后像这样使用:`ping_gw || (回声"没有网络,再见"&&退出1)` (13认同)
  • 对此要小心。我刚刚通过执行 `ifconfig down wlan0` 进行了测试,我仍然有一个默认网关并且可以 ping 通,尽管我实际上无法访问外部世界。 (3认同)

小智 28

超级感谢用户somedrew他们张贴在这里:https://bbs.archlinux.org/viewtopic.php?id=55485于2008-09-20 2时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
Run Code Online (Sandbox Code Playgroud)

注意那些对bash不熟悉的人:最后的'if'语句测试是否[!]在线并且如果是这种情况则退出.有关详细信息,请参阅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


leg*_*gel 22

这适用于MacOSX和Linux:

#!/bin/bash

ping -q -w1 -c1 google.com &>/dev/null && echo online || echo offline
Run Code Online (Sandbox Code Playgroud)


Luc*_*ein 11

在 Bash 中,通过/dev/ { udp , tcp } / host / port使用它的网络包装器:

if : >/dev/tcp/8.8.8.8/53; then
  echo 'Internet available.'
else
  echo 'Offline.'
fi
Run Code Online (Sandbox Code Playgroud)

:是 Bash 无操作,因为您只想测试连接,而不是处理。)


pax*_*blo 7

之前我编写过脚本只需使用telnet连接到端口80,然后传输文本:

HTTP/1.0 GET /index.html
Run Code Online (Sandbox Code Playgroud)

然后是两个CR/LF序列.

如果您返回某种形式的HTTP响应,通常可以假设该站点正在运行.

  • 因为wget和curl并不总是可用的(例如,企业环境中的限制).从时间t = 0开始,Telnet一直是每个UNIX的标准部分. (6认同)
  • 为什么重新发明轮子?卷曲和wget都完美地做到这一点. (3认同)
  • 好点,尽管wget很普遍。另一个选择是netcat(nc),尽管在这种情况下,它与telnet相比没有任何改进。 (2认同)

Fuw*_*wan 7

最佳答案错过了这样一个事实,即你可以与你的默认网关建立一个非常稳定的连接,但这并不意味着你可以在互联网上实际获得一些东西.OP询问他/她如何测试与世界的联系.所以我建议通过将网关IP更改为局域网外的已知IP(xyzw)来改变最佳答案.

所以答案会变成:

ping -q -w 1 -c 1 x.y.z.w > /dev/null && echo ok || echo error
Run Code Online (Sandbox Code Playgroud)

同时删除命令替换的不受欢迎的反引号[1].

如果您只是想在执行某些代码之前确保连接到世界,您还可以使用:

if ping -q -w 1 -c 1 x.y.z.w > /dev/null; then
    # more code
fi
Run Code Online (Sandbox Code Playgroud)


Wai*_*ung 5

确保您的网络允许TCP流量进出,那么您可以使用以下命令获取面向公众的IP

curl ifconfig.co
Run Code Online (Sandbox Code Playgroud)


Cha*_*ara 5

执行以下命令以检查网站是否已启动以及该Web服务器显示的状态消息:

$ curl -Is http://www.google.com | head -1 HTTP/1.1 200 OK

状态码“ 200 OK”表示请求成功,并且可以访问网站。

  • 更好的实现可以是`curl-是http://www.google.com | 头-1 | grep 200; 如果[[$?-eq 0]]; 然后; 回显“在线”;其他; 回显“离线”;fi;` (2认同)

Fra*_*sc0 5

顶部投票答案因此对于那些在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
Run Code Online (Sandbox Code Playgroud)

在 MacOS High Sierra 10.12.6 上测试

  • 将 `route` 命令更改为 `route -n get default 2> /dev/null | grep gateway` 以避免在离线时将错误写入 stderr。 (2认同)