首先,我要为在编程,编写脚本等方面的绝对菜鸟道歉。 我正在运行FreeNAS服务器和Raspberry Pi,我想包含一个sh脚本,该脚本应检查8个客户端(IP地址)是否在线。如果是,它们应该停止,但是如果所有IP都处于脱机状态,则它应该执行另一个任务/脚本。
这是我的问题:在Internet上(src:https://www.tech-blogger.net/freenas-automatisch-bei-nicht-benutzung-abschalten/),我发现了一个脚本,该脚本可以检查特定IP,如果它们处于脱机状态,它将自动关闭。当我ping这些地址时,我会丢失100%的软件包,这表明它们已脱机。但是该脚本使我感到呼应,至少一个客户端处于脱机状态。因为我不是那个愚蠢的人,所以我认为它与我的代码有关。有人知道我的脚本出了什么问题吗?:
HOST1=192.168.1.32
HOST2=192.168.1.33
HOST3=192.168.1.34
HOST4=192.168.1.35
HOST5=192.168.1.36
_exit () {
case $1 in
1) echo „No Shutdown – At least one PC is online“ ;;
2) echo „No PC is online – Shutdown“ ; shutdown -p now ;;
esac
exit $1;
}
#Check if IPs are online
if [ `ping -c 1 -i 1 $HOST1 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST2 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST3 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST4 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST5 | grep -wc 100.0%` -eq 0 ] ; then _exit 1;
#All Clients are offline, shutdown
else
_exit 2
fi
fi
答案 0 :(得分:0)
我不确定100%能否正确解决您的问题。但是我认为您应该尝试替换||。在您的if语句中使用&&。
|| =或 && =和
因此,当所有客户端都关闭时,它将仅进入关机部分。
ping -c 1 -i 1 192.168.1.36
PING 192.168.1.36 (192.168.1.36) 56(84) bytes of data.
From 62.155.241.85 icmp_seq=1 Destination Host Unreachable
--- 192.168.1.36 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
这是100%的数据包丢失,不是 100.0%。因此,您可以检查未发生的事情。
#!/bin/bash
HOST1=192.168.1.32
HOST2=192.168.1.33
HOST3=192.168.1.34
HOST4=192.168.1.35
HOST5=192.168.1.36
_exit () {
case $1 in
1) echo „No Shutdown – At least one PC is online“ ;;
2) echo „No PC is online – Shutdown“ ;; # shutdown -p now ;;
esac
exit $1;
}
#Check if IPs are online
if [ `ping -c 1 -i 1 $HOST1 | grep -wc 100%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST2 | grep -wc 100%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST3 | grep -wc 100%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST4 | grep -wc 100%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST5 | grep -wc 100%` -eq 0 ] ; then _exit 1;
#All Clients are offline, shutdown
else
_exit 2
fi
这按预期工作(在我的机器上)。 :-)
答案 1 :(得分:0)
正如威廉·珀塞尔(William Pursell)在评论中说的那样,当ping
未达到请求的IP时,它将返回一个非零的退出代码,指示失败。 Bash之类的shell中的if
语句可以直接使用该退出代码,而不必使用带括号的条件表达式。
我建议使用循环而不是长时间的条件。如果主机数量发生变化,这将更易于阅读和维护,并且更易于扩展。
# create an array of IPs
host_ips=(
192.168.1.32
192.168.1.33
192.168.1.34
192.168.1.35
192.168.1.36
)
for ip in "${host_ips[@]}"
do
if ping -c 1 -i 1 "$ip"
then
_exit 1
# no need to break since _exit doesn't return
fi
done
# if we made it this far, none are online
_exit 2