Невозможно выйти из bash-скрипта в конце цикла for - PullRequest
1 голос
/ 01 октября 2019

Я написал простой IP-сканер, основанный на ping (см. Ниже), но у него есть проблема.

#!/bin/bash

counter = 0

for ip in 192.168.44.{1..254}; do
  ping -c 1 -W 1 $ip | grep "64 bytes" &
  let counter++
  if [[ "$counter" -eq 254 ]];
  then
      exit 0;
  fi
done

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

Script output

и янужно нажать Enter, чтобы окончательно завершить его.

Я также пытался поместить exit 0 после оператора done, но он все еще не работает. Как я могу заставить скрипт завершиться, когда завершится цикл for?

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

Ответы [ 3 ]

1 голос
/ 02 октября 2019

Предполагая, что вы не хотите использовать специализированные инструменты сетевого сканирования, вы можете использовать bash или xargs для перебора всех адресов параллельно: Bash:

#! /bin/bash -x

for ip in 192.168.44.{1..254}; do
  ping -c 1 -W 1 $ip | grep "64 bytes" &
done
# Wait for all children to finish
wait

Или с xargs, с преимуществом, чтоВы можете контролировать количество проверяемых параллельных адресов (20 в этом примере) - чтобы избежать перегрузки вашего сервера большим количеством одновременных процессов.

echo 192.168.44.{1..254} | xargs --max-args=1 -P20 ping -c 1 -W 1
1 голос
/ 02 октября 2019

Вы можете попробовать это:

#!/bin/bash
for ip in 192.168.44.{1..254}; do
  ping -c 1 -W 1 $ip | grep "64 bytes" & 
done
wait
0 голосов
/ 07 октября 2019

Если CTRL c приемлемо:

parallel -j0 --lb ping ::: 192.168.1.{1..250}
...