Вы можете использовать этот скрипт:
#!/bin/bash
if [ -z $1 ] ; then
echo "Please enter ip address"
exit 1
fi
function print_os_type() {
case $2 in
64) echo "$1 Linux" ;;
128) echo "$1 Windows" ;;
*) echo "$1 Unknown os type";;
esac
}
function get_ttl() {
ping -c1 -w1 $1 | grep ttl | awk '{print $6}' | tr -d "ttl="
}
if [ ! -z $2 ] ; then
IPS=$(nmap -sL -n $1/$2 | grep report | awk '{print $5}')
for I in ${IPS[@]}
do
ttl=$(get_ttl $I)
print_os_type $I $ttl
done
else
ttl=$(ping -c1 -w1 $1 | grep ttl | awk '{print $6}' | tr -d "ttl=")
print_os_type $1 $ttl
fi
Использование:
./script.sh 192.168.1.1 #For single ip
./script.sh 172.16.10.0 24 #For subnet of ips
или просто используйте эту команду:
nmap -n -O 192.168.1.0/24 | grep 'OS details'
Примечание: это ужасная идея использовать ttl для определения типа ОС. некоторые люди вроде меня меняют этот ttl вручную:
root@HOSTNAME:~# echo 110 > /proc/sys/net/ipv4/ip_default_ttl
root@HOSTNAME:~# ping -c1 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=110 time=0.069 ms
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.069/0.069/0.069/0.000 ms