如何编写一个Linux bash脚本,告诉我我的局域网中哪些计算机是开启的?

33

我该如何编写一个Linux Bash脚本,告诉我哪些计算机在我的局域网中处于开启状态?

如果我能够输入一个IP地址范围作为脚本的输入参数将会很有帮助。


1
使用Nagios http://www.nagios.org/ 可能是一个不错的主意,而不是每次都运行脚本,但如果你很匆忙,它非常有用。 (+1) - Alex Bolotov
16个回答

1
如果您想提供主机列表,可以使用nmap、grep和awk来完成。
安装nmap:
$ sudo apt-get install nmap

创建名为hostcheck.sh的文件,内容如下:

hostcheck.sh

#!/bin/bash

nmap -sP -iL hostlist -oG pingscan > /dev/null
grep Up pingscan | awk '{print $2}' > uplist
grep Down pingscan | awk '{print $2}' > downlist

-sP:Ping扫描 - 仅确定主机是否在线

-iL:从主机/网络列表中输入

-oG:将扫描结果以Grepable格式输出到指定的文件名中。

/dev/null:丢弃输出

更改访问权限:

$ chmod 775 hostcheck.sh

创建一个名为hostlist的文件,其中包含需要检查的主机列表(主机名或IP地址):
hostlist(示例)
192.168.1.1-5
192.168.1.101
192.168.1.123

192.168.1.1-5是一个IP地址范围。

运行脚本:

./hostcheck.sh hostfile

将生成文件pingscan,其中包含所有信息,uplist列出在线主机(Up),downlist列出离线主机(Down)。

uplist(示例)

192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.101

下拉列表(示例)

192.168.1.5
192.168.1.123

1

如果你只限制最后一个八位数的变化,这个脚本应该可以做到。从一个八位数扩展到多个八位数也应该很明显。

#! /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 响应" fi counter=$(( $counter + 1 )) done

1

"ip neighbor" 和 "arp -a" 不会显示您长时间(或根本)未通信的机器。 - Tarnay Kálmán

0
#!/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

下面这段(邪恶的)代码比 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

嗯,这是我代码中的一部分。

ship.sh 一个简单实用的网络地址多功能工具,具有丰富的功能

对网络进行ping操作,显示该网络上在线的主机及其本地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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接