Согласно этому ответу и многим другим учебным руководствам всюду по сети, ifconfig
перечислит большую захватывающую и полезную информацию. И, который кажется стандартным способом узнать материал как моя сетевая маска.
Но для сценариев мне нужна только сама сетевая маска для eth0
; и man ifconfig
было бесполезно с этим вопросом.
Я использую VPS, таким образом, я не имею контроля над своей сетевой маской; я должен узнать то, на что это было установлено.
(Примечание: В то время как мне нужно eth0
, некоторые машины могли бы иметь другого, сказать eth1
или ens3
, который также был бы полезен.)
inet 111.222.333.444 netmask 255.255.255.0 broadcast 111.222.555.666
netmask 255.255.255.0
затем выполнение sed "s/netmask //"
потому что материал может измениться — если эксперт не говорит такВероятно, это - то, в чем Вы нуждаетесь (обратите внимание, что это не будет работать над Ubuntu 16.04):
#!/bin/bash
IFACE='eth0'
ifconfig | grep -A 7 "$IFACE" | sed -nr 's/^.*netmask\s([0-9\.]+)\s\sbroadcast.*$/\1/p'
В первой строке название сетевого интерфейса назначено значением переменной $IFACE
- это полезно для сценариев, иначе можно использовать grep -A 7 'eth0'
.
На второй строке вывод команды ifconfig
будет передан по каналу к grep
команда, где опция -A 7
произведет следующие 7 строк после строки с совпавшей строкой/regexp. Вывод той команды будет передан по каналу к sed
.
В sed
команда:
регулярное выражение ^.*netmask\s(.*)\s\sbroadcast.*$
будет соответствовать к целой строке, с начала ^
в конец $
, это содержит некоторые символы .*
и "ключевые слова" netmask\space
, [0-9\.]+
и \s\sbroadcast
в том точном порядке;
той строкой заменят (s/old/new/
) с содержанием первой группы получения [(.*)
->\1
], где regexp [0-9\.]+
будет соответствовать к строкам, которые состоятся из точек конца цифр;
опция -r
(или -E
) включит расширенные регулярные выражения, которые, в этом случае, позволят нам использовать круглые скобки свободно;
опция -n
с комбинацией флага p
с выводом только подобранная строка и сохранит остальных вывод sed
.
Вот расширенный пример, который проанализирует названия всех сетевых интерфейсов и сделает подобный как вышеупомянутая команда для каждого из них:
for IFACE in $(ifconfig | sed -nr 's/(^[a-z0-9]+):.*/\1/p'); do \
echo -en "${IFACE}:\t"; ifconfig | \
grep -A 7 "$IFACE" | \
sed 's/ broadcast.*$//' | \
sed -rn 's/^.*netmask (.*)$/\1/p'; \
done
Демонстрационный вывод вышеупомянутой команды, выполняемой на виртуальной машине с Ubuntu 18.04:
$ for IFACE in $(ifconfig | sed -nr 's/(^[a-z0-9]+):.*/\1/p'); do echo -en "${IFACE}:\t"; ifconfig | grep -A 7 "$IFACE" | sed 's/..broadcast.*$//' | sed -rn 's/^.*netmask (.*)$/\1/p'; done
ens33: 255.255.255.0
lo: 255.0.0.0