Отключить ОС от пинга с помощью скрипта bash? - PullRequest
0 голосов
/ 09 июля 2020
  1. Проблема: недавно я хочу попробовать написать простой скрипт для определения ОС из скрипта ping (на основе TTL (время жизни))

  2. То, что я пробовал: я пробовал кое-что вроде этого

#!/bin/bash                                                                    

sn=${1:-$1}

for host in $(seq 1 255); do
                            
    ttlstr=$(ping -c1 -w1 $sn.$host | grep -o 'ttl=[0-9][0-9]*') || {
        printf "%s is Offline\n" "$sn.$host"
        continue;
    }
    ttl="${ttlstr#*=}"           
    printf "%s is Online, ttl=%d\n" "$sn.$host" "$ttl"
    if [ $ttl -eq 64 ]
            then
                echo "Operating is Linux"
            elif [ $ttl -eq 128 ]
            then
                echo "Operating is Windows"
            else
                echo "Operating is IOS"
                fi

done
Итак, как вы можете видеть, он может пинговать каждый IP-адрес с заданным IP-адресом. Но если пользователь хочет ввести: 192.168.1.0/24, как я могу это решить?

Наконец, спасибо за ваш ответ: D

1 Ответ

1 голос
/ 09 июля 2020

Вы можете использовать этот скрипт:

#!/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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...