我该如何编写一个Linux Bash脚本,告诉我哪些计算机在我的局域网中处于开启状态?
如果我能够输入一个IP地址范围作为脚本的输入参数将会很有帮助。
$ sudo apt-get install nmap
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
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
如果你只限制最后一个八位数的变化,这个脚本应该可以做到。从一个八位数扩展到多个八位数也应该很明显。
#! /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
ip neighbor
(IP 邻居)arp -a
(ARP 表)#!/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
下面这段(邪恶的)代码比 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秒钟...
嗯,这是我代码中的一部分。
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