Пинговать несколько IP-адресов без выхода из SSH с помощью сценария оболочки - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть список IP-адресов, которые должны пинговать друг друга. Как только я перешлю SSH к IP-1, мне нужно пропинговать все IP в цикле, прежде чем я выйду из цикла.

Я попробовал следующее ..

for name in "${ip[@]}";
do
 status=$(ssh -n -o LogLevel=QUIET -t -t -o StrictHostKeyChecking=no 
  ubuntu@$node ping -W 2 -q -c 5 $name")
  if [ "$?" -eq "2" ]; then
   echo -e "$(tput setab 7) $(tput setaf 1)$(date) $i unable to ping $name 
   $(tput sgr0)"
 fi
done

Этот код работает. Однако каждый раз, когда требуется SSH, что влияет на производительность, так как в моем списке более 100 IP-адресов.

Могу ли я получить помощь по этому вопросу?

1 Ответ

0 голосов
/ 14 сентября 2018

Вы можете просто сделать этот список частью команды, которую вы запускаете на целевом хосте, что-то вроде этого:

ips=( "10.0.0.1" "10.0.0.2")
ssh serverName 'for i in '${ips[@]}'; do ping ${i} -c1; done'

Обратите внимание на ломающуюся одиночную кавычку для передачи массива.

Edit:

Просто чтобы упомянуть об этом здесь: инструмент "fping" вполне подходит для этой работы.Это даст вам только тот список, который вы просили:

ips=( "10.0.0.1" "10.0.0.2")
ssh serverName 'fping -a '${ips[@]}' 2>/dev/null'

Cupcake прав насчет возможных проблем, которые возникают при передаче списка, как предполагается, с записями, содержащими пробелы.Однако в этом особом случае пробелы не ожидаются.

Это должно дать вам список IP-адресов без fping

ips=( "10.0.0.1" "10.0.0.2")
ssh serverName 'for host in '${ips[@]}'; do if ping -c1 -w1 ${host} >/dev/null 2>&1; then echo ${host};fi;done'
...