Маска подсети: считаем на bash

Thank you for reading this post, don't forget to subscribe!

Мас­ка под­се­ти — это набор битов, опре­де­ля­ю­щий, какое коли­че­ство битов исполь­зу­ет­ся для ука­за­ния адре­са под­се­ти, а какое для ука­за­ния адре­са ком­пью­те­ра в этой под­се­ти. Более при­выч­но мас­ку под­се­ти видеть в деся­тич­ном виде, но на самом деле она пред­став­ля­ет­ся в бинар­ном виде. Если вы пони­ма­е­те, как пред­став­ля­ет­ся адрес под­се­ти и адрес ком­пью­те­ра в этой под­се­ти, то може­те лег­ко опре­де­лить по адре­су ком­пью­те­ра и мас­ке под­се­ти адрес этой самой под­се­ти и мас­ку под­се­ти в таком виде:

<адрес-подсети>/<количество-бит>.

Пример маски подсети

Пред­по­ло­жим, у вас есть неко­то­рая сеть 192.168.1.0 (сеть клас­са C), а мас­ка под­се­ти (netmask) пред­став­ле­на как 255.255.255.0 (в бинар­ном виде это 11111111 11111111 11111111 00000000). Это гово­рит о том, что для адре­са под­се­ти выде­ле­ны пер­вые 24 бита, а под адрес ком­пью­те­ра в под­се­ти 8 бит, то есть, интер­вал зна­че­ний послед­не­го окте­та (послед­них 8 бит) будет при­ни­мать 256 раз­лич­ных зна­че­ний (зна­че­ния от 0 до 255 вклю­чи­тель­но), где 0 — это адрес под­се­ти, а 255 — бро­ад­каст. Соот­вет­ствен­но, под адре­са ком­пью­те­ров вы смо­же­те выде­лить 254 адре­са (от 1 до 254). И, нахо­дясь на каком-либо ком­пью­те­ре под управ­ле­ни­ем опе­ра­ци­он­ной систе­мы на базе ядра Linux, вы може­те посмот­реть адрес ком­пью­те­ра и сете­вую мас­ку при помо­щи команд «ifconfig» и «ip addr».

Ино­гда тре­бу­ет­ся имея адрес ком­пью­те­ра и мас­ку под­се­ти опре­де­лить адрес под­се­ти и бит­ность сете­вой мас­ки, что­бы пред­ста­вить адрес под­се­ти в виде

Напри­мер:

Давай­те попро­бу­ем решить зада­чу по тако­му пре­об­ра­зо­ва­ния на bash.

 

Перевод из десятичной системы в двоичную в bash

Для реше­ния зада­чи нам необ­хо­ди­мо будет пере­ве­сти мас­ку под­се­ти в бинар­ный вид, посколь­ку мас­ка под­се­ти (netmask) — это после­до­ва­тель­ность бит, опре­де­ля­ю­щая, какие из бит в ука­зан­ном адре­се выде­ле­ны под адрес под­се­ти (бит уста­нов­лен в еди­ни­цу), а какие — под адрес ком­пью­те­ра в под­се­ти. Это очень важ­ный момент в пони­ма­нии IP адресов.

Функ­ции, кото­рая поз­во­ля­ет пре­об­ра­зо­вать деся­тич­ные чис­ла в дво­ич­ные, в bash нет, поэто­му необ­хо­ди­мо будет исполь­зо­вать неболь­шую хит­рость. Она заклю­ча­ет­ся в том, что мы можем сге­не­ри­ро­вать мас­сив из после­до­ва­тель­но­стей еди­ниц и ноли­ков, каж­дый эле­мент кото­ро­го будет являть­ся дво­ич­ным пред­став­ле­ни­ем деся­тич­но­го зна­че­ния индек­са это­го элемента.

Эта строч­ка будет раз­вер­ну­та в мас­сив, содер­жа­щий 8-раз­ряд­ные зна­че­ния, что рав­но­силь­но сле­ду­ю­щим операциям:

 

Перевод из двоичной системы в десятичную в bash

Обрат­ное пре­об­ра­зо­ва­ние нам потре­бу­ет­ся, что­бы пре­об­ра­зо­вать после­до­ва­тель­ность бит обрат­но в деся­тич­ное чис­ло. Тут всё про­ще. В bash есть воз­мож­ность пре­об­ра­зо­вы­вать чис­ло из N-рич­но­го в деся­тич­ное, где N — это чис­ло до 64 вклю­чи­тель­но. Вот как это выгля­дит для систе­мы счис­ле­ния с осно­ва­ни­ем 2 (дво­ич­ной):

Как види­те, в дан­ном слу­чае всё очень просто.

 

Пишем скрипт

Если вы хоти­те исполь­зо­вать коман­ду ip для полу­че­ния адре­са и мас­ки под­се­ти, а не ifconfig, кото­рый счи­та­ет­ся уста­рев­шим, вам нуж­но толь­ко поме­нять вычис­ле­ние пере­мен­ной PARAMS, так, что­бы ее зна­че­ние содер­жа­ло адрес ком­пью­те­ра и мас­ку под­се­ти в виде «192.168.1.10 255.255.255.0».