Portál AbcLinuxu, 8. června 2025 19:06
Takze, potrebuji udelat bashovy skript, ktery mi nastavi sit. Vsechno je zatim bez problemu, akorat nevim jak udelat, aby si ze zadane masky subnetu vypocital delku prefixu. Takze v podstate potrebuji, aby skript zjistil, zda na pozici kazdeho oktetu je nenulove cislo a podle toho vypocital delku nutneho prefixu.
Jeden priklad pro ukazku, protoze nevim jestli jsem se vyjadril srozumitelne.
zadam masku napr. 255.255.255.0 coz znamena prefix 24 (3x8=24)
napadlo me aby se nastavil automaticky na 24, ale pak by se mohlo stat, ze to proste nebude fungovat (co kdyby nekdo zadal 255.255.255.255 ? Pak by delka nebyla dostacujici.)
Diky moc
BTW: s bashovymi skripty teprve zacinam, takze omluvte moji neschopnost to udelat sam
PREFIX=`ipcalc $IPADRESA/$MASKA| grep Netmask | awk '{ print $4 }'`ps: nezkousel jsem, ale je sance ze to pujde...
karin:~# IPADRESA=192.168.200.100 karin:~# MASKA=255.255.255.224 karin:~# PREFIX=`ipcalc $IPADRESA/$MASKA| grep Netmask | awk '{ print $4 }'` karin:~# echo $PREFIX 27
ipcalc
existuje ve dvou "vyhotoveních". Jedním z nich je výmysl RedHatu, vyskytuje se na Fedoře (a Redhatu), přičemž je s tím druhým syntakticky nekompatibilní.
Na druhou stranu, má i své výhody, takže zjištění délky prefixu se obejde bez grepu a výsledek lze rovnou přiřadit do proměnné:
$ ipcalc -p 192.168.200.100 255.255.255.224 PREFIX=27Takže program, který bude přenositelný alespoň mezi distribucemi, by se dal napsat třeba v Pythonu a výpočet délky prefixu by mohl vypadat třeba takto:
#!/usr/bin/env python import socket, struct mask = '255.255.255.224' mask_n = struct.unpack('!L',socket.inet_aton(mask))[0] b = 0 while b < 32: if 0xFFFFFFFF >> b << b == mask_n: break b += 1 b = 32 - b if b: print 'Netmask is equivalent to %d non-zero bits. ' %b else: print 'netmask could not be converted!'
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.