在我的学校,网络不可用(每天晚上23:00之后学校会断网,让我们睡觉>..<),然后ping永远不会停止,虽然我使用了参数ping -w1 ...
。
也就是说,当我使用:ping -q -w1 -c1 8.8.8.8
检查 Internet 连接是否启动/关闭时,它将在那里没有任何输出并且不会退出,就像我使用单个cat
.
我不知道为什么会这样,但我认为问题与school-internet-service有关。有什么建议吗?(我认为wget
可能是一个不错的选择,但我该如何使用它?)
使用 wget:
#!/bin/bash
wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
echo "Online"
else
echo "Offline"
fi
如果学校真的关闭了他们的路由器,而不是将所有流量重定向到“你为什么不睡觉”页面,那么就不需要下载整个网页或发送 HTTP 标头。您所要做的就是建立连接并检查是否有人在听。
nc -z 8.8.8.8 53
这将输出“连接到 8.8.8.8 端口 53 [tcp/domain] 成功!” 如果有人在听,则返回值 0。
如果你想在 shell 脚本中使用它:
nc -z 8.8.8.8 53 >/dev/null 2>&1
online=$?
if [ $online -eq 0 ]; then
echo "Online"
else
echo "Offline"
fi
采用:
#!/bin/bash
INTERNET_STATUS="UNKNOWN"
TIMESTAMP=`date +%s`
while [ 1 ]
do
ping -c 1 -W 0.7 8.8.4.4 > /dev/null 2>&1
if [ $? -eq 0 ] ; then
if [ "$INTERNET_STATUS" != "UP" ]; then
echo "UP `date +%Y-%m-%dT%H:%M:%S%Z` $((`date +%s`-$TIMESTAMP))";
INTERNET_STATUS="UP"
fi
else
if [ "$INTERNET_STATUS" = "UP" ]; then
echo "DOWN `date +%Y-%m-%dT%H:%M:%S%Z` $((`date +%s`-$TIMESTAMP))";
INTERNET_STATUS="DOWN"
fi
fi
sleep 1
done;
输出将产生如下内容:
./internet_check.sh
UP 2016-05-10T23:23:06BST 4
DOWN 2016-05-10T23:23:25BST 19
UP 2016-05-10T23:23:32BST 7
行尾的数字表示前一个状态的持续时间,即向上 19 秒,向下 7 秒。
使用超时选项-t
:
ping -q -t 5 -w1 -c1 8.8.8.8 t
安装 fping: > 问题比ping少。
fping google.com | grep alive
例如,使用如下:
#!/bin/bash
itest=$(fping google.com | grep alive)
while [ "$itest" == "" ]
do
sleep 5
itest=$(fping google.com | grep alive)
done
echo now online
使用上面的例子。我写了这个脚本来记录你的连接状态: https ://gist.github.com/cganterh/ffc2fffa8263857cbece
首先,将以下代码保存到name.sh
文件中。
#!/bin/bash
while true
do
wget -q --tries=10 --timeout=20 -O - http://google.com > /dev/null
if [[ $? -eq 0 ]]; then
echo $(date) "1" | tee -a log.csv
else
echo $(date) "0" | tee -a log.csv
fi
sleep 5
done
然后,在终端中执行name.sh
文件,然后查看log.csv
同一文件夹中的日志状态信息。
没有 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
享受 ;)
我决定结合之前的一些答案,这样我以后就可以创建一个显示起起落落及其持续时间的图:
#!/bin/bash
#
# pinger is a bash shell script that monitors the network
# status every 15 seconds and records if it is up '1' or down '0'
# into the file log.csv from whence it may be plotted.
#
# author: J. W. Wooten, Ph.D.
# since: 11/12/2019
# version: 1.0
#
TIMESTAMP=`date +%s`
while [ 1 ]
do
nc -z -w 5 8.8.8.8 53 >/dev/null 2>&1
online=$?
TIME=`date +%s`
if [ $online -eq 0 ]; then
echo "`date +%Y-%m-%d_%H:%M:%S_%Z` 1 $(($TIME-$TIMESTAMP))" | tee -a log.csv
else
echo "`date +%Y-%m-%d_%H:%M:%S_%Z` 0 $(($TIME-$TIMESTAMP))" | tee -a log.csv
fi
TIMESTAMP=$TIME
sleep 15
done;
这将每 15 秒输出到一个 CSV 文件。使用 Excel 或 Numbers,您可以读取文件并创建一个图表,该图表将显示 Internet 连接何时不可用以及持续时间。如果它从您的睡眠间隔发生变化,那么它正在花费时间尝试连接。我希望添加在下一次检测到网络关闭时向我发送文本的功能。
Majal 解决方案的一个变体只是测试 ping 的返回代码,如果站点响应,则返回 0,如果没有回复,则返回 1,如果网络不可达,则返回 2。
ping -c 1 -t 5 8.8.8.8 2&>1
rc=$?
[[ $rc -eq 0 ]] && { echo "Connected to the Internet" ; exit 0 ; } \
|| [[ $rc -eq 1 ]] && { echo "No reply from Google DNS" ; exit 1 ; } \
|| [[ $rc -eq 2 ]] && { echo "Network unreachable" ; exit 2 ; }
使用 ping 的好处是不需要下载任何东西,提高了测试的速度。
ping
单独的 Bash 脚本中的可靠旧版本:#!/bin/bash
ipaddr='8.8.8.8' # Google's public DNS server
[[ -z `ping -c1 $ipaddr |& grep -o 'Network is unreachable'` ]] || exit 1
[[ -z `ping -c3 $ipaddr |& grep -o '100% packet loss'` ]] && exit 0 || exit 1
把它放在一个单独的脚本中。它将处理不同的网络情况,如(1)未连接到网络,(2)连接到网络,但无法访问互联网(或至少谷歌),以及(3)连接到互联网。
您可以稍后使用exit code
脚本的 来检查连接性,例如
~$ script-name && echo online || echo offline