Я хочу, чтобы моя сетевая маска на Linux. Он выводится с помощью, ifconfig
но я хочу извлечь строку.
Я хочу, чтобы моя сетевая маска на Linux. Он выводится с помощью, ifconfig
но я хочу извлечь строку.
Ответы:
Я должен уточнить, что код здесь работает для Linux (обратите внимание на комментарии и пост о других Unices). ОП попросил решение для Linux, но было бы хорошо изменить вопрос на «как получить маску сети» в целом, и дать ответ, сочетающий лучший способ для большего количества вариантов Unix.
#!/bin/sh
ifconfig "$1" | sed -rn '2s/ .*:(.*)$/\1/p'
./script eth0
Наряду с другими традиционными сетевыми командами, такими как netstat, arp, rarp и route, ifconfig является частью пакета net-tools . Net-tools не разрабатывались активно с очень долгого времени, и есть попытки отказаться от него в пользу более нового пакета iproute2 . Для краткости, если вы хотите получить более подробную информацию об этом фундаментальном переходе, вот несколько соответствующих ссылок:
Страница руководства для net-tools ifconfig (см. Раздел «ОШИБКИ»)
/sbin/ifconfig eth0 | awk '/Mask:/{ print $4;} '
?
/sbin/ifconfig eth0 | awk -F: '/Mask:/{print $4}'
/sbin/ifconfig eth0 | awk '/netmask/{print $4}'
Интересно, ты действительно хочешь только маску? Может быть, вы действительно хотите, чтобы сеть (или 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» на моей машине.
ip -o -f inet addr show scope global
и ip route list default
.
Если вы используете ОС, которая выводит маску в шестнадцатеричном формате, вы можете сделать что-то вроде:
#!/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"
/sbin/ifconfig eth0 | grep Mask | cut -d":" -f4
awk
что не так в реальной жизни ifconfig
. Я хотел бы предложить несколько изменений , хотя: ifconfig eth0 | grep -o 'Mask:[^\s]*' | cut -d':' -f2
. -o
Так , что grep
только возвращает часть строки , а не всей партии (более эффективно). Сопоставьте непробельные символы ( [^\s]*
), чтобы найти конец токена сетевой маски. Одинарные кавычки вокруг поля разделителя для безопасности.
/sbin/ifconfig | grep ask | sed -e 's/.*netmask //g' | sed -e 's/ .*//g'
выводить маску в шестнадцатеричном виде.
Если вы ищете маску сети для сетевого устройства по умолчанию, эта команда возвращает устройство по умолчанию, поскольку устройством по умолчанию может быть не eth0
netdevice=$(ip r | grep default | awk '/default/ {print $5}')
И эта команда возвращает маску:
netmask=$(ifconfig "$netdevice" | awk '/netmask/{ print $4;}')
Благодаря Элии Каган и Пауло Томе, которые помогли мне и упростить, и уточнить ответ. На моем персональном компьютере сетевым устройством по умолчанию было «wlx504654c1a91», которое было слишком сложным для запоминания и точного ввода, отсюда и двухэтапный процесс.
grep 'pattern' | awk '{ action }'
обычно можно уменьшить доawk '/pattern/ { action }'
ifconfig
строка маски сети FreeBSD :,inet 192.168.144.120 netmask 0xffffff00 broadcast 192.168.144.255
так что, хотя ответы можно легко скорректировать, вероятно, нет единого размера для всех (используя только Bash / ifconfig) ,