2009-11-13 2 views
9

Я хочу Баш скрипт, который будет делать:как использовать пинг в сценарии

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

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

ответ

12

Использование ping, возвращаемого значения:

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

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

+1

Этот ответ неверен, если вы не настроили маршрут по умолчанию для IP-адреса назначения, который вы пингоруете, вы все равно получите 0 возвращаемое значение. –

+2

@SpaceRocker: Очень интересно! Я только что проверил 'man ping', и я склонен считать это поведение ошибкой в' ping', так как я ожидаю, что в этом случае будет возвращено значение 2. Цитата: _ «Если ping не получает никаких пакетов ответа вообще, он выйдет с кодом 1. Если оба значения пакета и крайний срок указаны, и к тому времени, когда истечет крайний срок, будут получены меньше, чем количество пакетов, оно также выйдет с кодом 1. При другой ошибке он выходит с кодом 2. В противном случае он выходит с кодом 0. Это позволяет использовать код выхода, чтобы узнать, жив ли хост или нет. »_ Что вы берете на себя? – Stephan202

0

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

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

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

8

Используйте переключатель -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. 
+0

Строка RETVAL = $? не работает - я новичок в bash. Как вы это заработаете? – Guy

+0

извините - моя ошибка. Он работает – Guy

+0

должен быть '[$ RETVAL -eq 0]'. – Rhubbarb

-1

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

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 
4

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

 
for c in compuers; do 
    ssh -o ConnectTimeout=2 $c 'check something' 
done 
+0

Это единственное правильное решение. Есть много других причин, по которым ping завершится неудачно, когда SSH-соединение будет успешным. –

0

Использование 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

Вот мой хак:

#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 [email protected]${ipaddress} 

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

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

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

+0

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