在 shell 脚本中询问主机名?

在 shell 脚本中询问主机名?

我有一个脚本询问某个 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 已关闭。您有很多选择,但正如前面提到的,问题不在于您的脚本伙伴。祝你好运。

相关内容