我想编写一个脚本,可以不断检查网络中应该全天在线的设备是否真的在线。我尝试使用ping命令,但是...
if [ "`ping -c 1 some_ip_here`" ]
then
echo 1
else
echo 0
fi
无论我输入有效还是无效的IP地址,都会返回1
。如何检查特定地址(或更好地,来自IP地址列表的任何设备)是否离线?
我想编写一个脚本,可以不断检查网络中应该全天在线的设备是否真的在线。我尝试使用ping命令,但是...
if [ "`ping -c 1 some_ip_here`" ]
then
echo 1
else
echo 0
fi
无论我输入有效还是无效的IP地址,都会返回1
。如何检查特定地址(或更好地,来自IP地址列表的任何设备)是否离线?
Ping根据错误类型返回不同的退出代码。
ping 256.256.256.256 ; echo $?
# 68
ping -c 1 127.0.0.1 ; echo $?
# 0
ping -c 1 192.168.1.5 ; echo $?
# 2
0表示主机可达
2表示不可达
if
确实检查了退出代码... - burtekecho 1
块,只要有任何非0退出代码(所有错误)。但是要弄清楚是什么类型的错误,您需要检查确切的退出代码。 - StianEping
打印的文本输出,并检查它是否为空字符串。由于ping
无论成功与否都会打印出一些内容,所以它永远不会打印空字符串,因此脚本总是执行echo 1
。 - Jonathan Wakely在if语句中不需要使用反引号。您可以使用此检查
if ping -c 1 some_ip_here &> /dev/null
then
echo "success"
else
echo "error"
fi
if 命令检查下一条命令(ping)的退出代码。如果退出代码为零(这意味着命令成功退出),则执行 then 块。如果它返回非零退出代码,则执行 else 块。
ping -t 1 -c 1 <ip>
吗? - alperping -c 1 127.0.0.1 &> /dev/null && echo success || echo fail
将127.0.0.1替换为IP地址或主机名,在两种情况下用需要执行的命令替换echo命令。
上面的代码将成功,可以尝试使用您知道无法访问的IP地址或主机名。
像这样:
ping -c 1 google.com &> /dev/null && echo success || echo fail
和这个
ping -c 1 lolcatz.ninja &> /dev/null && echo success || echo fail
有一个名为"fping"的高级ping版本,它可以定义以毫秒为单位的超时时间。
#!/bin/bash
IP='192.168.1.1'
fping -c1 -t300 $IP 2>/dev/null 1>/dev/null
if [ "$?" = 0 ]
then
echo "Host found"
else
echo "Host not found"
fi
fping
的单位是毫秒,如果你需要ping很多台主机,这一点非常重要。 - Fedir RYKHTIK-t
选项不是用于设置超时时间,而是用于设置TTL(生存时间)。超时时间应该使用-W
选项来指定。请注意:如果DNS服务器关闭并且需要解析DNS名称,则此操作仍可能会阻塞很长时间。考虑到最近的攻击事件,应该对此进行评估。 - dom0cmd; if [ $? = 0 ]; then ...
,更好、更符合惯用法的写法是 if cmd; then ...
-- shell 中 if
和其他流程控制语句的目的正是运行一个命令并检查其退出状态。你很少需要直接检查 $?
。 - tripleeeif cmd; then ...
。同时建议您使用 shellcheck 对脚本进行检查。 - ptha这是一个完整的bash脚本,每5秒ping一次目标,并将错误记录到文件中。
享受!
#!/bin/bash
FILE=errors.txt
TARGET=192.168.0.1
touch $FILE
while true;
do
DATE=$(date '+%d/%m/%Y %H:%M:%S')
ping -c 1 $TARGET &> /dev/null
if [[ $? -ne 0 ]]; then
echo "ERROR "$DATE
echo $DATE >> $FILE
else
echo "OK "$DATE
fi
sleep 5
done
提供信息, 我刚刚使用上述方法进行了一些测试,如果我们使用多个ping(10个请求)
ping -c10 8.8.8.8 &> /dev/null ; echo $?
如果至少有一个ping结果可达,则多ping命令的结果将为“0”,如果所有ping请求都无法到达,则结果为“1”。
up=`fping -r 1 $1 `
if [ -z "${up}" ]; then
printf "Host $1 not responding to ping \n"
else
printf "Host $1 responding to ping \n"
fi
for i in `cat Hostlist`
do
ping -c1 -w2 $i | grep "PING" | awk '{print $2,$3}'
done
每秒检查主机并在主机可达时发送消息
while :;do ping -c 1 -w 1 -q 8.8.8.8 &>/dev/null && /root/telegram-send.sh "Host reacheble now" && break || sleep 1;done
我喜欢检查像这样的列表的想法:
for i in `cat Hostlist`
do
ping -c1 -w2 $i | grep "PING" | awk '{print $2,$3}'
done
但是那段代码片段并不关心主机是否无法访问,所以在我看来并不是一个很好的答案。
我接受了它并写下了:
for i in `cat Hostlist`
do
ping -c1 -w2 $i >/dev/null 2>&1 ; echo $i $?
done
然后我可以分别处理每个。
nmap
,它允许你指定 IP 地址范围。 - devnullping -c 1 some_ip_here
”。参考此链接以获取更多信息 - Anubisping
命令打印的所有输出,然后检查是否为非空字符串。由于无论成功与否,ping
命令总是会打印出一些内容,因此它永远不会打印空字符串。要检查一个命令是否成功,不需要用反引号、引号或括号将其包围起来。只需直接写if cmd; then ... fi
即可。 - Jonathan Wakely