Файл .bashrc изменился после перезагрузки.

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

Оригинальный ответ

nmap был бы моим # 1 выбором, но что, если у вас нет Это ? Метод DIY будет иметь скрипт ping, который будет проходить через каждый возможный IP-адрес в сети вручную. То, что у нас есть, - это всего лишь цикл while, где мы устанавливаем последний номер в адресе, делаем тихий одиночный пинг по адресу, проверяем, была ли команда успешной или нет (и если она преуспела, то узел явно вверх) и заявление. Быстро и грязно, мне потребовалось около 10 минут, чтобы написать его, но время выполнения может быть немного медленным.

#!/bin/sh
# set -x
NUM=1

while [ $NUM -lt 256  ];do 
    ping -q -c 1 192.168.0.$NUM > /dev/null 
    RESULT=$(echo $?)
    if [ $RESULT -eq 0 ]; then 
        printf 192.168.0.$NUM"\n"
    fi
    NUM=$(expr $NUM + 1)
done

Revisited Answer

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

Скрипт явно медленный, и ping ждет ответа от хоста. По умолчанию ping для двух RTT, которые могут различаться в зависимости от того, насколько перегружена ваша сеть, и насколько я понимаю протокол TCP удваивает время ожидания каждый раз (по крайней мере, в соответствии с этим). Поэтому мы могли бы заставить ping тайм-аут с флагом -w 1. Поскольку у нас 256 адресов, и мы принимаем 1 секунду для каждого адреса, сценарий займет около 256/60 = 4,27 минуты. Выполнение команды, а затем захват ее статуса выхода с помощью $? не было действительно необходимым. [F13] может работать с командами напрямую. Другими словами, этого достаточно:
if ping -w 1 -q -c 1 192.168.0.$NUM > /dev/null ;
then
     <some other code here>
fi
Команда printf может быть переписана так:
printf "IP %s is up\n" 192.168.0."$NUM"
Это больше похоже на стилистическое изменение, но оно согласуется с тем, как printf работает и выглядит во многом других языков, с цитированием переменной "$NUM". Цитирование здесь не обязательно - поскольку мы имеем дело только с числами, нам не нужно ожидать разбиения слов из-за наличия пробелов в переменной. Гораздо лучшее улучшение производительности может быть достигнуто, если мы создадим несколько фоновых процессов. Скрипт, приведенный ниже, делает именно это. Я положил ping и printf в функцию, pingf (да, банальное имя, я знаю). Теперь есть еще одна функция main, которая выполняет цикл и вызов pingf.
#!/bin/sh
# Uncomment for debugging
#set -x
pingf(){
    if ping -w 2 -q -c 1 192.168.0."$1" > /dev/null ;
    then 
        printf "IP %s is up\n" 192.168.0."$1"
    fi
}

main(){

    NUM=1
    while [ $NUM -lt 255  ];do 
        pingf "$NUM" &
        NUM=$(expr "$NUM" + 1)
    done
    wait
}

main

Насколько лучше это работает? Неплохо, на самом деле, занимает несколько секунд.

$ time ./ping_script.sh                                                                      
IP 192.168.0.1 is up
IP 192.168.0.101 is up
IP 192.168.0.27 is up
IP 192.168.0.29 is up
    0m02.50s real     0m00.01s user     0m00.12s system

Вещи для поддержания в уме

Скрипт явно медленный, и ping ждет ответа от хоста. По умолчанию ping для двух RTT, которые могут различаться в зависимости от того, насколько перегружена ваша сеть, и насколько я понимаю протокол TCP удваивает время ожидания каждый раз (по крайней мере, в соответствии с этим). Поэтому мы могли бы заставить ping тайм-аут с флагом -w 1. Поскольку у нас 256 адресов, и мы принимаем 1 секунду для каждого адреса, сценарий займет около 256/60 = 4,27 минут.
1
задан 14 February 2014 в 03:30

0 ответов

Другие вопросы по тегам:

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