Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: abadon в Jul 08, 2014, 23:31



Титла: Bash script за намиране на PTR записи
Публикувано от: abadon в Jul 08, 2014, 23:31
Здравейте,

Както съм написал и в темата, смятам се за начинаещ сприптописач на bash иначе с Линукса и доста други неща в ИТ-то съм добре запознат.

Искам да направя скрипт който чете списък с мрежи вкарани в битов формат (примерно 192.168.100.0/24), след което обхожда всички ip-та от зададените мрежи и връща валидните PTR записи.

Ето какво съм написал до момента:

Код:
NET_LST=nets.lst
oct1d1min=$(cat ${NET_LST} | while read Net; do echo `ipcalc $Net| grep "HostMin:"| awk '{print substr($2,1,1)}'`; done)
oct1d1max=$(cat ${NET_LST} | while read Net; do echo `ipcalc $Net| grep "HostMax:"| awk '{print substr($2,1,1)}'`; done)
#echo $oct1d1min
#echo $oct1d1max
array=( $oct1d1min )
for i in "${array[@]}"
do
   for ip in "$i"2.3.11{1..2}.{0..2}; do echo $ip; done | while read Res;
     do echo $Res point to: `host $Res | awk '{print $5}';` | grep -v "3(NXDOMAIN)"
   done;
done

като в nets.lst съм сложил това:

Код:
1.2.3.0/22
40.5.6.0/24
117.8.9.0/24

Кода се изпълнява без грешка, обаче взема PTR-ите на грешните мрежи, не на зададените за тест.

Въпросите са ми следните:

1. Има ли начин с print да принтвам целия октет на мрежата, не само първия, втория или N-тия знак от нея?

Ако разгледаме примерните мрежи от nets.lst, при обхождането да ми върне съответно 1 40 117, не както сега 1 4 1

Първоначалната ми идея беше всяка цифра от ip-то да я разбия на променлива, обаче сега ми се струва грешно, тъй като първия октет може да съдържа 1, 2 или 3 знака....

2. За цифрите от HostMax втори масив ли трябва да се прави? Като този втори масив да се съдържа в първия?

Благодаря предварително на всички които ще ми дадът идеи и примери за решаване на казуса ми!


Титла: Re: Bash script за намиране на PTR записи
Публикувано от: jet в Jul 09, 2014, 00:13
можеш да използваш awk:
echo "111.222.333.44" | awk -F'.' '{print $1}'

връща 111
'.' е делимитъра който разделя стринга

с  '{print $1}' - можеш да избираш кой октет да ти вади



Титла: Re: Bash script за намиране на PTR записи
Публикувано от: abadon в Jul 09, 2014, 09:55
Блаягодаря jet преправих кода така:

Код:
NET_LST=nets.lst
oct1min=$(cat ${NET_LST} | while read Net; do echo `ipcalc $Net| grep "HostMin:"| awk '{print $2}'| awk -F'.' '{print $1}'`; done)
oct1max=$(cat ${NET_LST} | while read Net; do echo `ipcalc $Net| grep "HostMax:"| awk '{print $2}'| awk -F'.' '{print $1}'`; done)
echo $oct1min
echo $oct1max
array=( $oct1min )
for o1min in "${array[@]}"
do
array=( $oct1max )
for o1max in "${array[@]}"
do
      for ip in {"$o1min".."$o1max"}.3.11{1..2}.{0..2}; do echo $ip; done | while read Res;
do echo $Res point to: `host $Res `
    done;
done

nets.lst
Цитат
1.2.3.0/30
40.5.6.0/30
117.8.9.0/4

Обаче като го изпълня получавам следния резултат:
Цитат
1 40 112
1 40 127
host: '{1..1}.3.11{1..2}.{0..2}' is not a legal name (empty label)
{1..1}.3.11{1..2}.{0..2} point to:
host: '{1..40}.3.11{1..2}.{0..2}' is not a legal name (empty label)
{1..40}.3.11{1..2}.{0..2} point to:
host: '{1..127}.3.11{1..2}.{0..2}' is not a legal name (empty label)
{1..127}.3.11{1..2}.{0..2} point to:
host: '{40..1}.3.11{1..2}.{0..2}' is not a legal name (empty label)
{40..1}.3.11{1..2}.{0..2} point to:
host: '{40..40}.3.11{1..2}.{0..2}' is not a legal name (empty label)
{40..40}.3.11{1..2}.{0..2} point to:
host: '{40..127}.3.11{1..2}.{0..2}' is not a legal name (empty label)
{40..127}.3.11{1..2}.{0..2} point to:
host: '{112..1}.3.11{1..2}.{0..2}' is not a legal name (empty label)
{112..1}.3.11{1..2}.{0..2} point to:
host: '{112..40}.3.11{1..2}.{0..2}' is not a legal name (empty label)
{112..40}.3.11{1..2}.{0..2} point to:
host: '{112..127}.3.11{1..2}.{0..2}' is not a legal name (empty label)
{112..127}.3.11{1..2}.{0..2} point to:

Въпросите ми сега са следните:

1. Може ли във for на 12 ред да дефинирам range от две променливи, тъй като явно както съм го направил сега:
Код:
for ip in {"$o1min".."$o1max"}

не работи

2. С масиви ли да задам HostMin и HostMax или има някакви други техники? Питам за да знам за какво да чета в нета.

Сега от output-а който съм дал се вижда, че да вкарам втори масив във първия явно не е начина, тъй като двойките HostMin и HostMax които ще получа във for-а (след като намеря отговор на първия си въпрос) ще са

1 1
1 40
1 127
 
и т.н. а те трябва да са:

1 1
40 40
112 127

Предварително благодаря!




Титла: Re: Bash script за намиране на PTR записи
Публикувано от: abadon в Jul 10, 2014, 14:43
След доста главоблъскане и ровен в нета, промених цялостната стратегия и в крайна сметка след 3 дена борба нещата станаха:

Код:
############################                                                                                                                                                                                                                                             
##  Methods                                                                                                                                                                                                                                                             
############################                                                                                                                                                                                                                                             
prefix_to_bit_netmask() {
    prefix=$1;
    shift=$(( 32 - prefix ));

    bitmask=""
    for (( i=0; i < 32; i++ )); do
        num=0
        if [ $i -lt $prefix ]; then
            num=1
        fi

        space=
        if [ $(( i % 8 )) -eq 0 ]; then
            space=" ";
        fi

        bitmask="${bitmask}${space}${num}"
    done
    echo $bitmask
}

bit_netmask_to_wildcard_netmask() {
    bitmask=$1;
    wildcard_mask=
    for octet in $bitmask; do
        wildcard_mask="${wildcard_mask} $(( 255 - 2#$octet ))"
    done
    echo $wildcard_mask;
}



#######################                                                                                                                                                                                                                                                 
##  MAIN                                                                                                                                                                                                                                                                 
#######################                                                                                                                                                                                                                                                 
output=$(for ip in $@; do
    net=$(echo $ip | cut -d '/' -f 1);
    prefix=$(echo $ip | cut -d '/' -f 2);

    bit_netmask=$(prefix_to_bit_netmask $prefix);

    wildcard_mask=$(bit_netmask_to_wildcard_netmask "$bit_netmask");

    str=
    for (( i = 1; i <= 4; i++ )); do
        range=$(echo $net | cut -d '.' -f $i)
        mask_octet=$(echo $wildcard_mask | cut -d ' ' -f $i)
        if [ $mask_octet -gt 0 ]; then
            range="{0..$mask_octet}";
        fi
        str="${str} $range"
    done
    ips=$(echo $str | sed "s, ,\\.,g"); ## replace spaces with periods, a join...                                                                                                                                                                                       
    eval echo $ips | tr ' ' '\012'

done)
#echo $output
array=( $output )
for output in "${array[@]}"
do
      for ip in "$output"; do echo $ip; done | while read Res;
do echo $Res point to: `host $Res | awk '{print $5}';` | grep -v "3(NXDOMAIN)"| grep -v "2(SERVFAIL)"
    done;
done

това е финалния код, дано на някой някога му е от полза

Пуска се в конзолата с командата:
Цитат
./show-prefix-PTRs.sh 23.91.120.0/21 37.18.176.0/22 66.36.176.0/21

като можете да си изредите колкото искате префикса.


Титла: Re: Bash script за намиране на PTR записи
Публикувано от: dexxa в Jul 10, 2014, 23:08
nmap -R -sL 10.0.0.1/24|awk 'match($6, /\(/) {print $5}'
Това е за една мрежа. За повече - да се напише цикъл е лесно.
Програмирането е готино, но има хора, които вече са измислили това, което ми е нужно. Остава, само, да го намеря.
 [_]3