Як отримати мережну маску від bash?


8

Я хочу отримати свою маску в Linux. Він виводиться за допомогою, ifconfigале я хочу витягнути рядок.


5
Це питання важко, на самому ділі, якщо ви не вказуєте ОС, наприклад , FreeBSD - х ifconfigмаска підмережі лінії s є: inet 192.168.144.120 netmask 0xffffff00 broadcast 192.168.144.255, тому в той час як відповіді можуть бути легко відрегульована, то, ймовірно , немає один розмір підходить всім ( з допомогою Bash / Ifconfig тільки) .
sr_

Відповіді:


8

Я повинен уточнити, що код тут працює для Linux, (зверніть увагу на коментарі та повідомлення про інші Unices). OP попросив рішення для Linux, але було б добре змінити питання на "як отримати мережну маску" в цілому, і відповідь поєднає найкращий спосіб отримати більше ароматів Unix.

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

./script eth0

Про ifconfig в Linux

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

Приклад випадку: Debian Linux

Приклад випадку: Arch Linux

Основна сторінка для net-tools ifconfig (див. Розділ BUGS)

Аналіз та порівняння рамок з точки зору користувачів


Якщо у відповідного інтерфейсу немає маски, це рішення повертає значення "1". Регекс потребує серйозних переробок, щоб зробити його надійним / безпечним, включаючи необхідність належного якоря на дуже важливому слові "Маска".
Олівер Данджі

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

?


Ви пропущені | cut -c6-, щоб також зняти "Mask:"
michelemarcon

3
Вказавши роздільник поля awk, також працює для видалення "Mask:":/sbin/ifconfig eth0 | awk -F: '/Mask:/{print $4}'
Шейн

У 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
... це на самому справі не потрібно , щоб відповідати на «сфери глобальної» або « по умовчанням» або як ви можете зробити ip -o -f inet addr show scope globalі ip route list default.
bryn

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;}')

Дякую Еліа Каган та Пауло Томе, які допомогли мені спростити та уточнити відповідь. На моїй персональній машині за замовчуванням Ethernet-пристрій був "wlx504654c1a91", що було занадто складним, щоб точно запам'ятати і вводити, отже, процес з двома кроками.


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