Получить маску подсети в Linux с помощью bash

Я использую bash для получения IP-адреса моей машины с помощью этого скрипта:

_MyGW="$( ip route get 8.8.8.8 | awk 'N=3 {print $N}' )"

И теперь я пытаюсь получить маску подсети в этом виде:

192.168.1.0/24 

Но я понятия не имею, как я могу это сделать.


person ValeriRangelov    schedule 15.10.2015    source источник
comment
8.8.8.8 via 192.168.1.1 dev eth0 src 192.168.1.5 (IP-адреса не настоящие - только для примера)   -  person ValeriRangelov    schedule 15.10.2015
comment
Итак, /24 нет в вашем выводе команды ip, но вы хотите получить его в конечном выводе?   -  person anubhava    schedule 15.10.2015
comment
Да, но не обязательно с командой ip.   -  person ValeriRangelov    schedule 15.10.2015
comment
Эта команда просто печатает мой ip и в конце добавляет /24. ip route' output is: 192.168.1.0/24 `где последнее число перед ` is 0`.   -  person ValeriRangelov    schedule 15.10.2015
comment
Уточните, пожалуйста, как некоторая произвольная команда должна угадывать, какую подсеть вы хотите использовать. IP-адрес сам по себе не имеет абсолютно нулевой информации о том, какую маску подсети следует использовать. Единственным возможным исключением могут быть подсети, зарезервированные для частного использования (например, 192.168.0.0/16), но даже в этом случае подсеть не обязательно должна быть /16. Это может быть /24, как в вашем примере, или даже что-то еще из 16-32.   -  person Dark Falcon    schedule 15.10.2015
comment
Другими словами, ip route get не предоставляет информацию, необходимую для печати правильной информации о подсети.   -  person Dark Falcon    schedule 15.10.2015
comment
См. здесь функции преобразования.   -  person ceving    schedule 10.07.2021


Ответы (3)


есть несколько способов добиться этого:

первое: чтобы напечатать маску в формате 255.255.255.0, вы можете использовать это:

/sbin/ifconfig wlan0 | awk '/Mask:/{ print $4;} '

второе: мы можем использовать команду ip, чтобы получить маску в формате 192.168.1.1/24

ip -o -f inet addr show | awk '/scope global/ {print $4}'
person vishal    schedule 15.10.2015
comment
Вишал, это работает. Спасибо. Но у меня есть вопросы. В моем случае я заменил wlan0 на eth0, но когда я начинаю первую строку вашего ответа, у меня нет никаких входных данных. Что на самом деле должно быть для этого? - person ValeriRangelov; 15.10.2015
comment
сначала убедитесь, что у вас есть соединение eth0 с помощью команды ifconfig, если оно есть, оно должно печатать, в моем случае это сработало. :) - person vishal; 15.10.2015
comment
Да, у меня есть связь. Но я понимаю, что нужно делать. На самом деле мне не нужен этот вывод. - person ValeriRangelov; 15.10.2015
comment
именно это вы можете проверить из второй команды, просто добавив $2: ip -o -f inet addr show | awk '/ глобальная область видимости/ {print $2, $4}' - person vishal; 15.10.2015
comment
Да, это очень полезно для меня, потому что у меня более одного интерфейса. И на самом деле я пытаюсь сделать скрипт, который удаляет эти сети с помощью команды ip route. - person ValeriRangelov; 15.10.2015
comment
Еще один вопрос, можно ли изменить последний номер моего ip перед /xx на 0. Как пример в вопросе 192.168.1.0/24. - person ValeriRangelov; 15.10.2015
comment
Я так не думаю, потому что он берет адрес из системы, вы можете изменить адрес с помощью sudo ifconfig eth0 192.168.1.2 (но я не знаю его последствий), все же я попытаюсь найти ответ на ваш вопрос. :) - person vishal; 15.10.2015

Лучшим подходом будет:

 ifconfig eth0 | awk '/netmask/{split($4,a,":"); print a[1]}'

Вы можете заменить eth0 любым другим интерфейсом, который вы хотите

person RoyalBigMack    schedule 20.12.2017
comment
эта команда не работала для меня. выхода не было. Я использую убунту 18 - person Lidor shimoni; 24.01.2021
comment
починил это. ты можешь попробовать? - person RoyalBigMack; 25.01.2021

Простой способ сделать это для меня:

IP=$(ifconfig eth0 | grep -w inet | cut -d" " -f10) # device IP, e.g. 11.1.1.43
IP_RANGE=$(echo $IP | cut -d"." -f1-3).0/24 # subnet 11.1.1.0/24

Замените, конечно, eth0 на правильный интерфейс, отображаемый ifconfig.

person LoW    schedule 10.07.2021