Как я могу записать сценарий удара Linux, который говорит мне, какие компьютеры работают в моей LAN?

Как четко указано в прекрасном руководстве , Windows не поддерживается для использования в качестве управляющей машины. Даже если вам нужно установить его, следующая проблема, с которой вы столкнетесь, - попытаться убедить его использовать разумный ssh-клиент, к которому PuTTY не относится.

Я уверен, что вы можете использовать Подсистему Windows для Linux , чтобы получить доступ к разумной операционной системе внутри неразумной

.

32
задан Dumb Questioner 16 November 2015 в 14:45
поделиться

11 ответов

$matches = array();
$num_matched = preg_match_all('/\((.*)\)/U', $input, $matches);
Команда ping немного отличается в разных операционных системах, разных дистрибутивах / версиях (сейчас я использую OS X)

По умолчанию (опять же, в версии ping для OS X] ) она будет пинговать до прерывания, что не сработает, поэтому ping -c 1 будет пытаться отправить только один пакет, чего должно быть достаточно, чтобы определить, работает ли машина.

Другая проблема заключается в значение тайм-аута, которое, по-видимому, составляет 11 секунд для этой версии ping. Оно изменяется с помощью флага -t . Одной секунды должно быть достаточно, чтобы увидеть, является ли машина в локальной сети работоспособной или нет.

Итак, команда ping, которую мы будем использовать, является ..

$ ping -c 1 -t 1 192.168.1.1
PING 192.168.1.1 (192.168.1.1): 56 data bytes

--- 192.168.1.1 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss

Проверка результата ping

Далее, нам нужно знать, если машина ответила или нет ..

Мы можем использовать && оператор для запуска команды, если первое выполнено успешно, например:

$ echo && echo "It works"

It works
$ nonexistantcommand && echo "This should not echo"
-bash: nonexistantcommand: command not found

Хорошо, так что мы можем сделать ..

ping -c 1 -t 1 192.168.1.1 && echo "192.168.1.1 up!"

Другой способ - использовать код выхода из команды ping. Команда ping завершится с кодом завершения 0 (успех), если он сработал, и с ненулевым кодом, если произошел сбой. В bash вы получаете код завершения последних команд с переменной $?

Итак, чтобы проверить, сработала ли команда, мы сделаем ..

ping -c 1 -t 1 192.168.1.1;
if [ $? -eq 0 ]; then
    echo "192.168.1.1 is up";
else 
    echo "ip is down";
fi

Скрытие вывода ping

Последнее, мы не Не нужно видеть вывод ping, поэтому мы можем перенаправить stdout в / dev / null с перенаправлением > , например:

$ ping -c 1 -t 1 192.168.1.1 > /dev/null && echo "IP is up"
IP is up

И перенаправить stderr (чтобы отменить сообщения ping: sendto: Host is down ), вы используете 2> - например:

$ errorcausingcommand
-bash: errorcausingcommand: command not found
$ errorcausingcommand 2> /dev/null
$

Сценарий

Итак, чтобы объединить все это ..

for ip in 192.168.1.{1..10}; do  # for loop and the {} operator
    ping -c 1 -t 1 192.168.1.1 > /dev/null 2> /dev/null  # ping and discard output
    if [ $? -eq 0 ]; then  # check the exit code
        echo "${ip} is up" # display the output
        # you could send this to a log file by using the >>pinglog.txt redirect
    else
        echo "${ip} is down"
    fi
done

Или, используя метод && , в одну строку:

for ip in 192.168.1.{1..10}; do ping -c 1 -t 1 $ip > /dev/null && echo "${ip} is up"; done

Задача

Это медленно .. Каждый Команда ping занимает около 1 секунды (поскольку мы установили флаг -t timeout на 1 секунду). Он может запускать только одну команду ping за раз. Очевидный способ обойти это - использовать потоки, поэтому вы можете запускать параллельные команды, но это выходит за рамки того, что вы должны использовать bash для ..

"Потоки Python - первый пример « объясняет, как использовать модуль потоков Python для написания многопоточного ping'ера. Хотя в этот момент я бы еще раз предложил использовать nmap -sn ..

Каждая команда ping занимает около 1 секунды (поскольку мы установили флаг -t timeout на 1 секунду). Он может запускать только одну команду ping за раз. Очевидный способ обойти это - использовать потоки, поэтому вы можете запускать параллельные команды, но это выходит за рамки того, что вы должны использовать bash для ..

"Потоки Python - первый пример « объясняет, как использовать модуль потоков Python для написания многопоточного ping'ера. Хотя в этот момент я бы еще раз предложил использовать nmap -sn ..

Каждая команда ping занимает около 1 секунды (поскольку мы установили флаг -t timeout на 1 секунду). Он может запускать только одну команду ping за раз. Очевидный способ обойти это - использовать потоки, поэтому вы можете запускать параллельные команды, но это выходит за рамки того, что вы должны использовать bash для ..

"Потоки Python - первый пример « объясняет, как использовать модуль потоков Python для написания многопоточного ping'ера. Хотя в этот момент я бы еще раз предложил использовать nmap -sn ..

77
ответ дан jimp 27 November 2019 в 19:46
поделиться

Как отмечали другие авторы, nmap - это путь, но вот как это сделать эквивалент сканирования ping в bash. Я бы не стал использовать широковещательный пинг, так как многие системы в настоящее время настроены не отвечать на широковещательный ICMP.

for i in $(seq 1 254); do
    host="192.168.100.$i"
    ping -c 1 -W 1 $host &> /dev/null
    echo -n "Host $host is "
    test $? -eq 0 && echo "up" || echo "down"
done
1
ответ дан Don Werve 27 November 2019 в 19:46
поделиться

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

#! /bin/bash
BASE=$1
START=$2
END=$3

counter=$START

while [ $counter -le $END ]
do
  ip=$BASE.$counter
  if ping -qc 2 $ip
  then
    echo "$ip responds"
  fi
  counter=$(( $counter + 1 ))
done
1
ответ дан Vatine 27 November 2019 в 19:46
поделиться

Кроме того, используя метод "ping the широковещательный адрес", указанный chburd, этот канал должен помочь вам:

ping -c 5 -b 10.11.255.255 | sed -n 's/.* \([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\).*/\1/p' | sort | uniq

Конечно, вам придется изменить широковещательный адрес на адрес вашей сети.

2
ответ дан Can Berk Güder 27 November 2019 в 19:46
поделиться

Существует также fping :

fping -g 192.168.1.0/24

или:

fping -g 192.168.1.0 192.168.1.255

или отображаются только те хосты, которые

fping -ag 192.168.1.0/24

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

8
ответ дан d0k 27 November 2019 в 19:46
поделиться

Предполагая, что моя сеть 10.10.0.0/ 24, если я запущу эхо-запрос на широковещательный адрес, например

ping -b 10.10.0.255

, я получу ответ от всех компьютеров в этой сети, которые не заблокировали свой пинг-порт ICMP.

64 bytes from 10.10.0.6: icmp_seq=1 ttl=64 time=0.000 ms
64 bytes from 10.10.0.12: icmp_seq=1 ttl=64 time=0.000 ms 
64 bytes from 10.10.0.71: icmp_seq=1 ttl=255 time=0.000 ms 

Итак, вам просто нужно извлечь 4-й столбец, например, с помощью awk:

ping -b 10.10.0.255 | grep 'bytes from' | awk '{ print $4 }'

10.10.0.12:
10.10.0.6:
10.10.0.71:
10.10.0.95:

Ну, вы получите дубликат, и вам может потребоваться удалить ':'.

ИЗМЕНИТЬ из комментариев: опция -c ограничивает количество эхо-запросов , так как скрипт завершится, мы также можем ограничить себя уникальными IP-адресами

ping -c 5 -b 10.10.0.255 | grep 'bytes from' | awk '{ print $4 }' | sort | uniq
10
ответ дан chburd 27 November 2019 в 19:46
поделиться

В реальном мире вы можете использовать nmap , чтобы получить то, что вы хотите.

nmap -sn 10.1.1.1-255

Это пингует все адреса в диапазоне от 10.1.1.1 до 10.1.1.255 и позволяет узнать, какие из них отвечают.

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

14
ответ дан indivisible 27 November 2019 в 19:46
поделиться

Просто для удовольствия, вот альтернатива

     #!/bin/bash
     nmap -sP 192.168.1.0/24 > /dev/null 2>&1 && arp -an | grep -v incomplete | awk '{print$2}' | sed -e s,\(,, | sed -e s,\),,

2
ответ дан 27 November 2019 в 19:46
поделиться
1
ответ дан 27 November 2019 в 19:46
поделиться
#!/bin/bash

for ((n=0 ; n < 30 ; n+=1))
do
    ip=10.1.1.$n
    if ping -c 1 -w 1 $ip > /dev/null 2> /dev/null >> /etc/logping.txt; then  
        echo "${ip} is up" # output up
        # sintax >> /etc/logping.txt log with .txt format
    else
        echo "${ip} is down" # output down
    fi
done
0
ответ дан 27 November 2019 в 19:46
поделиться
#!/bin/bash
#Get the ip address for the range
ip=$(/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}' | cut -d"." -f1,2,3)

# ping test and list the hosts and echo the info

for range in $ip ; do  [ $? -eq 0 ] && ping -c 1 -w 1 $range > /dev/null 2> /dev/null && echo "Node $range is up" 
done
1
ответ дан 27 November 2019 в 19:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: