我有一个脚本询问某个 mac 阵列的 ping 是否在线。
#!/bin/bash
#Array of Mac hostnames separated by spaces
my_macs=( Mac111 Mac121 Mac122 Mac123 Mac124 Mac125 Mac126 Mac127 Mac128 Mac129 )
# Number of days the remote Mac is allowed to be up
MAX_UPDAYS=7
CURR_TIME=$(date +%s)
MAX_UPTIME=$(( MAX_UPDAYS * 86400 ))
ADMINUSER="admusr"
#Steps through each hostname and issues SSH command to that host
#Loops through the elements of the Array
echo "Remote shutdown check started at $(date)"
for MAC in "${my_macs[@]}"
do
echo -n "Checking ${MAC}... "
# -q quiet
# -c nb of pings to perform
if ping -q -c3 "${MAC}" >/dev/null; then
echo "is up. Getting boot time... "
BOOT_TIME=0
# Get time of boot from remote Mac
BOOT_TIME=$(ssh "${ADMINUSER}@${MAC}" sysctl -n kern.boottime | sed -e 's/.* sec = \([0-9]*\).*/\1/')
if [ "$BOOT_TIME" -gt 0 ] && [ $(( CURR_TIME - BOOT_TIME )) -ge $MAX_UPTIME ]; then
echo "${MAC} uptime is beyond MAX_UPDAYS limit. Sending shutdown command"
ssh "${ADMINUSER}@${MAC}" 'sudo /sbin/shutdown -h now'
else
echo "${MAC} uptime is below limit. Skipping shutdown."
fi
else
echo "is down (ping failed)"
fi
done
问题是,如果脚本无法解析其中一台机器的主机名,脚本就会停止(是的,这种情况经常发生,我不想详细说明原因)主机名绝对是正确的,所以我想告诉该脚本首先搜索主机名,如果可以解析,它将恢复。否则它将取消这台 mac 的它。这可能吗?
答案1
为什么不在路由器中通过添加设备的 MAC 地址来设置静态专用 IP 地址,而不是使用路由器作为 DHCP?如果您这样做,您将确保它们不会再在主机名上出错。另一方面,/etc/hosts
如果您没有在路由器中设置主机或者您的路由器不支持其他功能,则可以向您的路由器添加线路。您可以/etc/hosts
按照以下方式进行操作:
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##
127.0.0.1 localhost Mac1
255.255.255.255 broadcasthost Mac1
::1 localhost Mac1
fe80::1%lo0 localhost Mac1
172.16.11.43 Mac2
172.16.11.43 Mac3
172.16.11.43 Mac4
172.16.11.43 Mac5
.
.
.
这没什么大不了的,你的脚本出错的原因取决于你的网络配置,而不是脚本,甚至是 Mac 设备。您可以更轻松地编写脚本,但没关系。只需检查您的网络,并尝试进行静态设置,以便它们可以找到彼此。
它们失败的原因是它们没有使用公共静态 IP 地址,因此您应该确保已设置正确的静态私有 IP 地址,以便它们能够解析主机名。
顺便说一句,如果您想让脚本继续,即使主机名不可解析,另一个可能对您有帮助的选项是continue
在循环和条件语句中使用和添加。因此,如果它可以解析 X,它将检查它的运行时间是否超过 7 天或更短,如果不能,它将继续检查下一个主机名,并宣布 X 已关闭。您有很多选择,但正如前面提到的,问题不在于您的脚本伙伴。祝你好运。