bashからネットマスクを取得する方法は?


8

Linuxでネットマスクを取得したい。で出力されますifconfigが、文字列を抽出したいです。


5
この質問は実際には難しいです。たとえば、OSを指定しない場合、たとえば、FreeBSDのifconfigsネットマスク行は次のinet 192.168.144.120 netmask 0xffffff00 broadcast 192.168.144.255ようになります。したがって、答えは簡単に調整できますが、おそらくone-size-fits-allはありません(Bash / ifconfigのみを使用)。 。
sr_

回答:


8

ここのコードがLinuxで機能することを明確にする必要があります(他のUnicesに関するコメントと投稿に注意してください)。OPはLinuxソリューションを求めましたが、質問を「ネットマスクを取得する方法」に一般的に変更し、より多くのUnixフレーバーのための最良の方法を組み合わせて回答するのは良いことです。

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

./script eth0

Linuxのifconfigについて

netstat、arp、rarp、routeなどの他の従来のネットワークコマンドに加えて、ifconfigはnet-toolsパッケージの一部です。net-toolsは非常に長い間積極的に開発されておらず、新しいiproute2パッケージを支持して非推奨にする努力があります。簡潔にするために、この基本的な移行の詳細が必要な場合は、関連するリンクをいくつか示します。

事例:Debian Linux

事例:Arch Linux

net-tools ifconfigのマニュアルページ(バグセクションを参照)

ユーザーの観点からのフレームワークの分析と比較


問題のインターフェースにネットマスクがない場合、このソリューションは「1」を返します。正規表現は、非常に重要な単語「マスク」への適切なアンカーの必要性を含め、信頼性/安全性を高めるために、いくつかの深刻な再加工を必要とします。
Oliver Dungey

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


あなたがいません| 「マスク:」も削除するために-c6-をカット
michelemarcon

3
指定awkのフィールドセパレータはまた、削除するために働く「マスク:」:/sbin/ifconfig eth0 | awk -F: '/Mask:/{print $4}'
シェーン

Debian Stretch / net-tools 2.10-alphaでは、これに変更する必要がありました:/sbin/ifconfig eth0 | awk '/netmask/{print $4}'
Shane

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 globalip route list default
bryn

3

マスクを16進数で出力するOSを使用している場合は、次のようにすることができます。

#!/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]*)を照合して、ネットマスクトークンの終わりを見つけます。安全のため、フィールド区切り文字を単一引用符で囲みます。
Oliver Dungey

macOSでは/sbin/ifconfig | grep ask | sed -e 's/.*netmask //g' | sed -e 's/ .*//g'マスクを16進数で出力します。
戸町

1

デフォルトのネットワークデバイスのネットマスクを探している場合、デフォルトのデバイスはeth0ではない可能性があるため、このコマンドはデフォルトのデバイスを返します。

netdevice=$(ip r | grep default | awk '/default/ {print $5}')

そして、このコマンドはマスクを取得します:

netmask=$(ifconfig "$netdevice" | awk '/netmask/{ print $4;}')

Eliah KaganとPaulo Tomeのおかげで、答えを単純化および明確化することができました。私の個人用マシンでは、デフォルトのイーサネットデバイスは「wlx504654c1a91」でした。これは複雑すぎて覚えて正確に入力することができないため、2段階のプロセスが必要です。


1
grep 'pattern' | awk '{ action }'通常、次のように削減できますawk '/pattern/ { action }'
roaima
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.