我已经搜索过,遇到麻烦找到答案,对不起,如果这是一个新手问题......
我正在创建一个程序来自动重新连接到我的VPN并在断开连接时安装所需的驱动器。到目前为止,它工作正常(每隔60秒左右检查一次VPN)
当我不在wifi附近时出现问题,它一直在向我喊叫它无法连接。是否有一些代码存在,只是检查我是否连接到互联网之前运行其余的脚本,如果我没有连接到互联网,只是让我一个人,直到我重新连接?我能找到的大部分内容都是为了ping一个网站(这对我来说并不是不利的,特别是如果我可以使用它来ping VPN)但是在没有通知我它仍然无法看到服务器的情况下似乎无法在后台工作。
答案 0 :(得分:2)
有几种方法可以验证互联网连接;最简单的只是ping
一个外部主机(一个你期望的主机),然后检查状态代码。
在以下示例中将
www.google.com
替换为您需要的your.vpn.host
或任何主机。
host="www.google.com"
ping -c1 "$host" &> /dev/null
if [ $? -eq 0 ]; then
# connection is UP
else
# connection is DOWN
fi
或者,您可以使用nc
指定自定义端口号和连接超时期限:
# Note: w/ the macOS BSD version of `nc` you use the `-G` flag rather than the `-w` flag to specify the connection timeout.
host="www.google.com"
port=80
timeout=5
nc -G$timeout -z "$host" "$port" &> /dev/null
if [ $? -eq 0 ]; then
# connection is UP
else
# connection is DOWN
fi
如果您不想依赖外部命令,而是决定要利用bash
本机TCP套接字(并指定自定义端口号和连接超时时间) :
host="www.google.com"
port=80
timeout=5
echo > "/dev/tcp/$host/$port" & pid="$!"
{ sleep "$timeout"; kill "$pid"; } &> /dev/null &
wait "$pid" &> /dev/null
if [ $? -eq 0 ]; then
# connection is UP
else
# connection is DOWN
fi
如果您只是想检查您是否连接到特定界面上的WiFi网络(macOS 仅),您可以使用:
# Replace `en0` with the interface you want to check
networksetup -getairportnetwork en0
# There is no convenient status code check that I am aware of here. You can
# save the output to a variable and grep for the word: "off"
# I don't think this is what you need but to check if Wi-Fi is `enabled` use:
networksetup -getairportpower en0
# Again, you will need to grep for the word: "off"
对于更强大的替代方案,我建议你看看我编写的一个名为
check
的简单bash实用程序,专门用于检查代理服务器的连接性。 剧透:虽然这里没有魔法;我只是利用bash本机TCP / UDP套接字,虽然包含一组方便的选项和富有洞察力的使用文档。
最后,我在macOS中使用了一个稍微深奥的替代方案,启动守护进程暂停执行(即无限循环)直到互联网连接可用:
CheckForNetwork 是位于
/etc/rc.common
的shell函数,用于检查inet地址。它是一个有用的实用程序,但不会确保互联网连接(仅IP地址分配),而不是上述将验证连接的备选方案。
. /etc/rc.common
CheckForNetwork
while [ "${NETWORKUP}" != "-YES-" ]; do
sleep 60
NETWORKUP=
CheckForNetwork
done