Использовать ssh -t ...
вызвать pseudo-tty выделение (который является тем, что Вы получаете, когда Вы обычно входите в систему через ssh.)
Я должен разъяснить, что код здесь работает на Linux, (отметьте комментарии и сообщение о других Нельдах). OP попросила решение Linux, но будет хорошо изменить вопрос, "как получить сетевую маску" в целом и иметь объединение ответа лучший способ для большего количества разновидностей Unix.
#!/bin/sh
ifconfig "$1" | sed -rn '2s/ .*:(.*)$/\1/p'
./script eth0
Наряду с другими традиционными сетевыми командами как netstat, arp, rarp и маршрут, ifconfig является частью пакета сетевых инструментов. Сетевые инструменты не были активно разработаны с действительно долгого времени и существуют усилия удержать от использования его в пользу более нового iproute2 пакета. Ради краткости, если Вы хотите больше деталей об этом фундаментальном переходе, вот некоторые необходимые ссылки:
Страница справочника для сетевых инструментов ifconfig (см. раздел BUGS),
/sbin/ifconfig eth0 | awk -F: '/Mask:/{print $4}'
– Shane
16.09.2016, 23:57
/sbin/ifconfig eth0 | awk '/netmask/{print $4}'
– Shane
10.12.2017, 08:30
при использовании ОС, которая производит маску в шестнадцатеричном числе, можно сделать что-то как:
#!/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"
awk
который не имеет место в реальной жизни с ifconfig
. Я предложил бы несколько изменений хотя: ifconfig eth0 | grep -o 'Mask:[^\s]*' | cut -d':' -f2
. -o
так, чтобы grep
только часть возвратов строки, а не (более эффективных) всех. Соответствуйте непробельным символам ([^\s]*
) найти конец маркера сетевой маски. Одинарные кавычки вокруг разделителя полей для безопасности.
– Oliver Dungey
06.12.2017, 13:20
Интересно, хотите ли Вы действительно только маску. Возможно, Вы действительно хотите сеть (или 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" на моей машине.
Если вы ищете сетевую маску для сетевого устройства по умолчанию, эта команда возвращает устройство по умолчанию, поскольку устройство по умолчанию может быть не eth0
netdevice=$(ip r | grep default | awk '/default/ {print $5}')
И эта команда извлекает маску:
netmask=$(ifconfig "$netdevice" | awk '/netmask/{ print $4;}')
Спасибо Элии Кагану и Пауло Томе, которые помогли мне упростить и уточнить ответ. На моем личном компьютере сетевым устройством по умолчанию было «wlx504654c1a91», которое было слишком сложным для точного запоминания и ввода, отсюда и двухэтапный процесс.