Я хочу отримати свою маску в Linux. Він виводиться за допомогою, ifconfig
але я хочу витягнути рядок.
Я хочу отримати свою маску в Linux. Він виводиться за допомогою, ifconfig
але я хочу витягнути рядок.
Відповіді:
Я повинен уточнити, що код тут працює для Linux, (зверніть увагу на коментарі та повідомлення про інші Unices). OP попросив рішення для Linux, але було б добре змінити питання на "як отримати мережну маску" в цілому, і відповідь поєднає найкращий спосіб отримати більше ароматів Unix.
#!/bin/sh
ifconfig "$1" | sed -rn '2s/ .*:(.*)$/\1/p'
./script eth0
Поряд з іншими традиційними мережевими командами, такими як netstat, arp, rarp та route, ifconfig є частиною пакету net-tools . Net-інструменти не активно розробляються з давніх часів, і є зусилля, щоб знищити їх на користь нового пакету iproute2 . Для стислості, якщо вам потрібно детальніше про цей фундаментальний перехід, ось кілька відповідних посилань:
/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;}')
Дякую Еліа Каган та Пауло Томе, які допомогли мені спростити та уточнити відповідь. На моїй персональній машині за замовчуванням Ethernet-пристрій був "wlx504654c1a91", що було занадто складним, щоб точно запам'ятати і вводити, отже, процес з двома кроками.
grep 'pattern' | awk '{ action }'
зазвичай можна скоротити доawk '/pattern/ { action }'
ifconfig
маска підмережі лінії s є:inet 192.168.144.120 netmask 0xffffff00 broadcast 192.168.144.255
, тому в той час як відповіді можуть бути легко відрегульована, то, ймовірно , немає один розмір підходить всім ( з допомогою Bash / Ifconfig тільки) .