Как четко указано в прекрасном руководстве , Windows не поддерживается для использования в качестве управляющей машины. Даже если вам нужно установить его, следующая проблема, с которой вы столкнетесь, - попытаться убедить его использовать разумный ssh-клиент, к которому PuTTY не относится.
Я уверен, что вы можете использовать Подсистему Windows для Linux , чтобы получить доступ к разумной операционной системе внутри неразумной
.
$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
Далее, нам нужно знать, если машина ответила или нет ..
Мы можем использовать &&
оператор для запуска команды, если первое выполнено успешно, например:
$ 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, поэтому мы можем перенаправить 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
..
"Потоки Python - первый пример « объясняет, как использовать модуль потоков Python для написания многопоточного ping'ера. Хотя в этот момент я бы еще раз предложил использовать nmap -sn
..
"Потоки Python - первый пример « объясняет, как использовать модуль потоков Python для написания многопоточного ping'ера. Хотя в этот момент я бы еще раз предложил использовать nmap -sn
..
Как отмечали другие авторы, 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
Если вы ограничиваете себя только изменением последнего октета, этот скрипт должен это сделать. Должно быть достаточно очевидно, как расширить его с одного до нескольких октетов.
#! /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
Кроме того, используя метод "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
Конечно, вам придется изменить широковещательный адрес на адрес вашей сети.
Существует также 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
в его установку по умолчанию, но в большинстве дистрибутивов вы можете получить его через менеджер пакетов.
Предполагая, что моя сеть 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
В реальном мире вы можете использовать nmap , чтобы получить то, что вы хотите.
nmap -sn 10.1.1.1-255
Это пингует все адреса в диапазоне от 10.1.1.1 до 10.1.1.255 и позволяет узнать, какие из них отвечают.
Конечно, если вы действительно хотите сделать это как упражнение bash, вы можете запустить ping для каждого адреса и проанализировать вывод, но это совсем другая история.
Просто для удовольствия, вот альтернатива
#!/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,\),,
#!/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
#!/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