Как я могу написать скрипт Linux bash, который сообщает мне, какие компьютеры включены в моей локальной сети? - PullRequest
32 голосов
/ 09 апреля 2009

Как мне написать скрипт bash для linux, который сообщает мне, какие компьютеры включены в моей локальной сети?

Было бы полезно, если бы я мог указать в качестве входных данных диапазон IP-адресов.

Ответы [ 16 ]

1 голос
/ 09 апреля 2009

Как отмечали другие авторы, 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 голос
/ 09 апреля 2009
1 голос
/ 09 апреля 2009

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

#! /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
0 голосов
/ 13 мая 2017

Ну, это часть моего сценария.

ship.sh simple Простая и удобная сетевая адресация ? Многофункциональный инструмент с множеством функций ?

Pings network, отображает сетевые хосты в этой сети с их локальным IP и MAC-адресом

Не требует редактирования. Требуется разрешение root для запуска.

GOOGLE_DNS="8.8.8.8"
ONLINE_INTERFACE=$(ip route get "${GOOGLE_DNS}" | awk -F 'dev ' 'NR == 1 {split($2, a, " "); print a[1]}')
NETWORK_IP=$(ip route | awk "/${ONLINE_INTERFACE}/ && /src/ {print \$1}" | cut --fields=1 --delimiter="/")
NETWORK_IP_CIDR=$(ip route | awk "/${ONLINE_INTERFACE}/ && /src/ {print \$1}")
FILTERED_IP=$(echo "${NETWORK_IP}" | awk 'BEGIN{FS=OFS="."} NF--')

ip -statistics neighbour flush all &>/dev/null

echo -ne "Pinging ${NETWORK_IP_CIDR}, please wait ..."
for HOST in {1..254}; do
  ping "${FILTERED_IP}.${HOST}" -c 1 -w 10 &>/dev/null &
done

for JOB in $(jobs -p); do wait "${JOB}"; done

ip neighbour | \
    awk 'tolower($0) ~ /reachable|stale|delay|probe/{printf ("%5s\t%s\n", $1, $5)}' | \
      sort --version-sort --unique
0 голосов
/ 16 февраля 2014

Следующий (злой) код работает в два раза быстрее, чем метод nmap

for i in {1..254} ;do (ping 192.168.1.$i -c 1 -w 5  >/dev/null && echo "192.168.1.$i" &) ;done

занимает около 10 секунд, где стандарт nmap

nmap -sP 192.168.1.1-254

занимает 25 секунд ...

0 голосов
/ 27 октября 2009
#!/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
...