특정 Mac 어레이의 핑이 온라인인지 묻는 스크립트가 있습니다.
#!/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
라우터를 DHCP로 사용하는 대신 장치의 MAC 주소를 추가하여 라우터에 고정 개인 IP 주소를 설정해 보는 것은 어떨까요? 이렇게 하면 더 이상 호스트 이름에 오류가 발생하지 않도록 할 수 있습니다. 반면, /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
루프와 조건문을 사용하고 추가하는 것이 도움이 될 수 있습니다. 그래서 해결이 가능하다면 다양한 옵션이 있지만 앞서 언급했듯이 문제는 스크립팅 파트너가 아닙니다. 행운을 빌어요.