我希望能够测试我是否可以访问互联网。我的电脑已连接到住宅互联网连接。我想ping
这样使用:
ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error
但这是行不通的!
正如我所说,连接是由住宅提供的(实际上只是转发大学连接)。要访问互联网,您必须打开一个网络浏览器,要求您提供用户名和密码,然后才授予互联网访问权限。(我真的不知道网络配置等,无论如何我无权了解它的设置方式,所以我可以'在此方面不提供更多信息)
即使我实际上无法访问互联网,上面的代码也会打印“ok”。即使测试www.google.com
失败。我相信这是因为它被重定向到登录页面并且它“认为”正确地取回数据包。
如何可靠地检查我是否可以访问互联网?
一些背景
我想ssh
周末回家时通过连接到我房间里的电脑。连接有时会失败,所以我想创建一个脚本,每隔一段时间检查一次连接,并最终启动一个网络浏览器并发送用于xdotool
登录的击键。如果您知道重新打开连接以允许ssh
远程访问的更好方法,请也写下来。
更新:
一些示例输出nslookup
:
$ nslookup unix.stackexchange.com
Server: 127.0.1.1
Address: 127.0.1.1#53
Non-authoritative answer:
Name: unix.stackexchange.com
Address: 69.59.197.21
无论有没有互联网接入,结果都是完全相同的。 (我还尝试注销并重新登录,并多次连接和断开连接)。
另外,我想补充一点,这不是ssh
连接关闭。在一段时间内,我能够创建连接、执行操作并注销。经过几个小时的尝试后ssh the-IP
出现超时错误(我实际上注册了一个无IP帐户,因为IP是动态的,所以我正在这样做ssh mydomain.no-ip.org
)。
答案1
你在指挥中犯了一个致命的错误。
ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error
该命令ip r | grep default | cut -d ' ' -f 3
返回您的默认网关。因此,ping
它不会检查 Google,而是检查您所连接的路由器。路由器将发回一个数据包,这使得整个命令成立。这就是为什么它总是返回“ok”。它根本不检查互联网连接。但是,看看好的一面。它检查您是否连接到 LAN。
无论如何,您可能想要使用ping -q -w 1 -c 1 google.com > /dev/null && echo ok || echo error
而不是使用ip r | grep default | cut -d ' ' -f 3
。
答案2
听起来你需要一个像这样的程序自动无线网络。
答案3
如果呢?
if [[ $(ping -c1 -w1 google.com) ]]
then
echo "All good in the hood"
else
echo "Where are my interwebs?"
fi
或作为一行
if [[ $(ping -c1 -w1 google.com) ]]; then echo "All good in the hood"; else; echo "Where are my interwebs?"; fi
答案4
执行我要求的操作的唯一方法似乎是下载随机网页,然后查看内容是否与登录页面匹配。
例如做:
$ wget www.google.com
如果我可以访问互联网,将下载谷歌页面的 html 内容,而它只包含以下内容:
<!--
**
** ZEROSHELL Captive Portal Login Page
**
** (Native Interface)
**
-->
<html>
<head>
<title>Web Login</title>
...
</html>
如果它被重定向到登录页面。尽管我希望找到一个更优雅的解决方案,但它似乎可以很好地检测我想要的内容。