Конечно, настоящий network administrator должен уметь пересчитывать netmask в prefixlen в уме, разбуженный среди ночи. Но ум с возрастом имеет свойство притупляться - и почему-то именно в сфере арифметики в уме. Потому пишем костыль для стареющего админа - скрипт на любимом админском языке, который примет на входе длину префикса или сетевую маску - и подсчитает то, чего нам не хватало
#!/usr/bin/perl -w
# netmask <-> prefixlen convert
# usage: $0 mask|len
use strict;
if ($#ARGV != 0 || $ARGV[0] =~ /[^\d.]/) {
print STDERR "Usage: $0 mask|len\n";
exit 1;
}
if ($ARGV[0] =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) {
# на входе - сетевая маска
# максимально возможная длина префикса
my $r = 32;
# переводим адрес в число
my $n = ($1 << 24) + ($2 << 16) + ($3 << 8) + $4;
# пока не появится 1 в младшем бите,
# сдвигаем адрес вправо - и уменьшаем длину на 1
until ($n & 1) {
$n >>= 1;
$r--;
}
print $r, "\n";
} else {
# на входе - длина префикса
# переводим ее в числовой адрес маски
my $r = (0xffffffff << (32 - $ARGV[0]))
& 0xffffffff;
# и форматируем в dot-нотацию
for (my $i = 24; $i >= 0; $i -= 8) {
print (($r & (0xff << $i)) >> $i);
if ($i) {
print '.';
}
}
print "\n";
}
Комментариев нет:
Отправить комментарий