как использовать пинг в скрипте - PullRequest
10 голосов
/ 13 ноября 2009

Я хочу bash-скрипт, который будет делать:

for c in computers:
do
   ping $c
   if ping is sucessfull:
      ssh $c 'check something'
done

Если я только наберу ssh, а компьютер не отвечает, то время ожидания истекает всегда. Поэтому я подумал об использовании вывода ping, чтобы увидеть, жив ли компьютер или нет. Как я могу это сделать? Другие идеи тоже будут хороши

Ответы [ 8 ]

16 голосов
/ 13 ноября 2009

Используйте ping возвращаемое значение:

for C in computers; do
  ping -q -c 1 $C && ssh $C 'check something'
done

ping выйдет со значением 0, если этот одиночный пинг (-c 1) будет успешным. По истечении времени пинга, или если $C не может быть разрешено, он завершится с ненулевым значением.

8 голосов
/ 13 ноября 2009

Используйте переключатель -w (или -t во FreeBSD и OS X) в команде ping, затем проверьте возвращаемое значение команды.

ping -w 1 $c
RETVAL=$?
if [ $RETVAL -eq 0 ]; then
    ssh $c 'check something'
fi

Вы можете настроить параметр, который вы передаете, с помощью -w, если хосты, к которым вы подключаетесь, находятся далеко, а задержка выше.

С man ping:

   -w deadline
          Specify  a  timeout, in seconds, before ping exits regardless of
          how many packets have been sent or received. In this  case  ping
          does  not  stop after count packet are sent, it waits either for
          deadline expire or until count probes are answered or  for  some
          error notification from network.
4 голосов
/ 09 августа 2013

Не все сетевые среды позволяют проходить ping (хотя многие это делают), и не все хосты будут отвечать на запрос ping. Я бы порекомендовал не использовать ping, а вместо этого установить тайм-аут соединения для ssh:

for c in compuers; do
  ssh -o ConnectTimeout=2 $c 'check something'
done
0 голосов
/ 09 ноября 2018

Подтверждая оригинальный вопрос, на который ссылается Bash, вот пример для любого, кто хочет выполнить это в Fish shell:

ping -q -c 1 bogus.local; and echo "pinging the host worked"; or echo "pinging the host didn't work"
0 голосов
/ 18 марта 2015

Вот мой хак:

#ipaddress shell variable can be provided as an argument to the script.
while true
do
   nmap_output=$(nmap -p22 ${ipaddress})
   $(echo ${nmap_output} | grep -q open)
   grep_output=$?
   if [ "$grep_output" == 0 ] ; then
       #Device is LIVE and has SSH port open for clients to connect
       break
   else
       #[01 : bold
       #31m : red color
       #0m : undo text formatting
       echo -en "Device is \e[01;31mdead\e[0m right now .... !\r"
   fi
done
#\033[K : clear the text for the new line
#32 : green color
echo -e "\033[KDevice is \e[01;32mlive\e[0m !"
ssh user@${ipaddress}

Не полагается только на ping. Почему?
- Успешный ping не гарантирует вам успешного доступа ssh. Вы также можете добавить ping test к началу этого скрипта и выйти, если ping не пройден и ничего из вышеперечисленного не будет сделано.

Выше bash фрагмент скрипта, проверяет, если устройство, которое вы пытаетесь доступ имеет открытый порт SSH для клиентов (вы) для подключения. Требуется пакет nmap для установки.

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

0 голосов
/ 20 ноября 2013

Использование значения 64 в качестве инструмента измерения не логично. Вместо этого лучше использовать количество полученных / потерянных пакетов.

Этот скрипт будет работать:

RESULT="1"
PING=$(ping ADDRESS -c 1 | grep -E -o '[0-9]+ received' | cut -f1 -d' ')
if [ "$RESULT" != "$PING" ]
then
    DO SOMETHING
else
    DO SOMETHING
fi
0 голосов
/ 22 февраля 2013

Используйте это в вашем цикле bash:

RESULT="64"
PING=$(ping 127.0.0.1 -c 1 | grep 64 | awk '{print $1}')
if [ "$RESULT" != "$PING" ]
then
   #ping failed
else
   #ping successful, do ssh here
fi
0 голосов
/ 13 ноября 2009

Я написал этот скрипт около 10 лет назад:

http://www.win.tue.nl/~rp/bin/rshall

Вероятно, вам не понадобится часть, в которой он определяет каждый достижимый хост и перебирает каждый из них.

...