Solicitar hostname em um script de shell?

3

Eu tenho um script que pergunta se o ping de uma determinada matriz de macs está online.

#!/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]*\).*//')

        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

O problema é que o script pára se não for possível resolver o nome do host de uma dessas máquinas (sim, isso pode acontecer com bastante frequência, não quero entrar em detalhes por que) Os nomes de host estão definitivamente corretos, então eu quero dizer ao script para procurar primeiro o hostname e se ele puder ser resolvido, ele será retomado. Caso contrário, ele será cancelado para este mac. Isso é possível?

    
por Gunter 10.01.2017 / 09:17

1 resposta

3

Por que você não configura o endereço IP privado estático em seu roteador adicionando os endereços MAC do seu dispositivo em vez de usar seu roteador como DHCP? Se você fizer isso, você terá certeza de que eles não vão errar em nomes de host mais. Por outro lado, você pode adicionar linhas ao seu /etc/hosts se não estiver configurando hosts no roteador ou se o seu roteador não suportar mais detalhes. Você pode ter seu /etc/hosts como o seguinte:

##
# 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
.
.
.

Não é grande coisa, a razão pela qual o seu script está errado depende da sua configuração de rede, não do script ou mesmo dos dispositivos Mac. Você poderia ter escrito seu roteiro muito mais fácil, mas está tudo bem. Basta verificar sua rede e tentar configurar as coisas estaticamente para que elas possam se encontrar.

O motivo pelo qual eles falham é que eles não estão usando endereços IP estáticos públicos; portanto, você deve configurar os privados corretos e estáticos para que eles possam resolver nomes de host.

BTW, se você quiser que seu script continue mesmo que um nome de host não seja resolvido, a outra opção que pode ajudá-lo é usar e adicionar continue em seu loop e em instruções condicionais. Então, se ele puder resolver o X, ele verificará se ele está ativo por mais de 7 dias ou menos, e se não puder, continuará a verificar o próximo nome de host e anunciará que o X está desativado. Você tem muitas opções, mas como mencionado anteriormente, o problema não é seu companheiro de script. Boa sorte.

    
por 10.01.2017 / 09:48