Как получить сетевую маску от Bash?


8

Я хочу, чтобы моя сетевая маска на Linux. Он выводится с помощью, ifconfigно я хочу извлечь строку.


5
Этот вопрос сложен, на самом деле, если вы не укажете свою ОС, например, ifconfigстрока маски сети FreeBSD :, inet 192.168.144.120 netmask 0xffffff00 broadcast 192.168.144.255так что, хотя ответы можно легко скорректировать, вероятно, нет единого размера для всех (используя только Bash / ifconfig) ,
sr_

Ответы:


8

Я должен уточнить, что код здесь работает для Linux (обратите внимание на комментарии и пост о других Unices). ОП попросил решение для Linux, но было бы хорошо изменить вопрос на «как получить маску сети» в целом, и дать ответ, сочетающий лучший способ для большего количества вариантов Unix.

#!/bin/sh
ifconfig "$1" | sed -rn '2s/ .*:(.*)$/\1/p'

./script eth0

О ifconfig в Linux

Наряду с другими традиционными сетевыми командами, такими как netstat, arp, rarp и route, ifconfig является частью пакета net-tools . Net-tools не разрабатывались активно с очень долгого времени, и есть попытки отказаться от него в пользу более нового пакета iproute2 . Для краткости, если вы хотите получить более подробную информацию об этом фундаментальном переходе, вот несколько соответствующих ссылок:

Пример дела: Debian Linux

Пример дела: Arch Linux

Страница руководства для net-tools ifconfig (см. Раздел «ОШИБКИ»)

Анализ и сравнение структур с точки зрения пользователей


Если рассматриваемый интерфейс не имеет маски сети, это решение возвращает «1». Регулярному выражению требуется серьезная доработка, чтобы сделать его надежным / безопасным, в том числе необходимость правильной привязки к очень важному слову «Маска».
Оливер

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

?


Вы пропали без вести | вырезать -c6- для того, чтобы также удалить «Маску:»
michelemarcon

3
Указание разделителя полей awk также работает для удаления «Mask:»:/sbin/ifconfig eth0 | awk -F: '/Mask:/{print $4}'
Shane

В Debian Stretch / net-tools 2.10-alpha мне пришлось перейти на это:/sbin/ifconfig eth0 | awk '/netmask/{print $4}'
Шейн

7

Интересно, ты действительно хочешь только маску? Может быть, вы действительно хотите, чтобы сеть (или IP) с маской использовалась в файлах конфигурации, с nmapили как угодно.

В этом случае в Linux вы также можете проанализировать вывод ip ...команды.

Чтобы перечислить все интерфейсы с их адресом и маской в ​​нотации CIDR:

ip -o -f inet addr show | awk '/scope global/ {print $2, $4}'

Или ограничить его интерфейсом по умолчанию:

default_if=$(ip route list | awk '/^default/ {print $5}')
ip -o -f inet addr show $default_if | awk '{print $4}'

что дает мне «192.168.1.61/24» на моей машине.


2
... на самом деле нет необходимости совпадать с «scope global» или «default», как вы можете сделать ip -o -f inet addr show scope globalи ip route list default.
Брин

3

Если вы используете ОС, которая выводит маску в шестнадцатеричном формате, вы можете сделать что-то вроде:

#!/usr/bin/bash

# read the mask, and strip leading 0x if it's there
hexmask=$( echo $1 | sed -e 's/^0x//' )

# loop through $hexmask in pairs
#
for (( i=0; i<${#hexmask}; i+=2 )); do
        if (( $i > 1 )); then
                # use a . to separate octets
                # but don't print a leading .
                printf "%s" "."
        fi
        printf "%d" "0x${1:$i:2}"
done

printf "\n"

2
/sbin/ifconfig eth0 | grep Mask | cut -d":" -f4

Это лучший ответ, поскольку остальные полагаются на фиксированное количество столбцов, awkчто не так в реальной жизни ifconfig. Я хотел бы предложить несколько изменений , хотя: ifconfig eth0 | grep -o 'Mask:[^\s]*' | cut -d':' -f2. -oТак , что grepтолько возвращает часть строки , а не всей партии (более эффективно). Сопоставьте непробельные символы ( [^\s]*), чтобы найти конец токена сетевой маски. Одинарные кавычки вокруг поля разделителя для безопасности.
Оливер

на macOS я получаю /sbin/ifconfig | grep ask | sed -e 's/.*netmask //g' | sed -e 's/ .*//g'выводить маску в шестнадцатеричном виде.
Томати

1

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

netdevice=$(ip r | grep default | awk '/default/ {print $5}')

И эта команда возвращает маску:

netmask=$(ifconfig "$netdevice" | awk '/netmask/{ print $4;}')

Благодаря Элии Каган и Пауло Томе, которые помогли мне и упростить, и уточнить ответ. На моем персональном компьютере сетевым устройством по умолчанию было «wlx504654c1a91», которое было слишком сложным для запоминания и точного ввода, отсюда и двухэтапный процесс.


1
grep 'pattern' | awk '{ action }'обычно можно уменьшить доawk '/pattern/ { action }'
роайма
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.