Скрипт Bash ведет себя неожиданно / Странно - PullRequest
0 голосов
/ 27 мая 2019

Во-первых, я хочу извиниться за то, что был абсолютным новичком в программировании, написании сценариев и т. Д. Я использую сервер FreeNAS и Raspberry Pi, в который я хотел бы включить sh-Script, который должен проверять наличие 8 клиентов (IP-адреса) онлайн.Если да, они должны остановиться, но если все IP-адреса отключены, он должен выполнить другую задачу / скрипт.

Вот моя проблема: В Интернете (источник: https://www.tech -blogger.net / freenas-automatisch-bei-nicht-benutzung-abschalten / ) Я нашел скрипт, который проверяет конкретныеIP-адреса, и если они в автономном режиме, он должен отключиться автоматически.Когда я пингую те адреса, я получаю 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

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

Как сказал Вильям Перселл в комментарии, когда ping не достигает запрошенного IP, он возвращает ненулевой код выхода, указывающий на ошибку.Оператор if в таких оболочках, как Bash, может использовать этот код выхода напрямую, без необходимости использовать условные выражения в скобках.

Я бы рекомендовал цикл вместо длинных условных выражений.Это будет легче читать и поддерживать, и будет легче масштабироваться, если количество хостов изменится.

# 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
0 голосов
/ 27 мая 2019

Я не уверен на 100%, правильно ли я понял вашу проблему.Но я думаю, что вы должны попытаться заменить ||с && в вашем операторе if.

||= или && = и

Таким образом, он будет входить только в части выключения, когда все клиенты отключены.

edit:

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

Это работает, как и ожидалось (на моей машине).: -)

...