web-dev-qa-db-ja.com

VPS上のUbuntu 18.04でCLIを介してeth0ネットマスクのみを取得する「適切な」方法は?

この回答 およびWebの他の多くのチュートリアルによれば、ifconfigには多くの魅力的で有用な情報がリストされています。そして、それが私のネットマスクのようなものを見つける標準的な方法のようです。

しかし、スクリプトを作成するには、eth0のネットマスク自体のみが必要です。 man ifconfigはこの質問に対して役に立たなかった。

VPSを使用しているため、ネットマスクを制御できません。設定した内容を調べる必要があります。

(注:私はeth0が必要ですが、一部のマシンにはeth1またはens3と言う別のマシンがあり、これも有用です。)

  • 私はnotネットマスクがある行全体を必要とします:

inet 111.222.333.444 netmask 255.255.255.0 broadcast 111.222.555.666

  • I want to avoid a "hackdoor" method, like getting netmask 255.255.255.0 then running sed "s/netmask //" because stuff can change—unless an expert says so
2
Jesse Steele

おそらくこれが必要なものです(Ubuntu 16.04では動作しません)。

#!/bin/bash
IFACE='eth0'
ifconfig | grep -A 7 "$IFACE" | sed -nr 's/^.*netmask\s([0-9\.]+)\s\sbroadcast.*$/\1/p'

最初の行では、ネットワークインターフェースの名前が変数$IFACEの値として割り当てられます-これはスクリプト作成に役立ちます。それ以外の場合はgrep -A 7 'eth0'を使用できます。

2行目では、コマンドifconfigの出力がgrepコマンドにパイプされます。オプション-A 7は、一致した文字列/正規表現を持つ行の後に次の7行を出力します。そのコマンドの出力は、sedにパイプされます。

sedコマンド内:

  • 正規表現^.*netmask\s(.*)\s\sbroadcast.*$は、最初の^から最後の$までの行全体に一致します。これには、いくつかの文字.*と「キーワード」が含まれますnetmask\space[0-9\.]+ =および\s\sbroadcast正確な順序で。

  • その行は、最初のキャプチャグループ[s/old/new/-> (.*)]のコンテンツで置き換えられます(\1)。ここで、正規表現[0-9\.]+は、数字とドットで構成される文字列に一致します。

  • オプション-r(または-E)は、拡張正規表現を有効にします。この場合、丸括弧を自由に使用できます。

  • フラグpと組み合わせたオプション-nは、一致した行のみを出力し、sedの残りの出力を保持します。


すべてのネットワークインターフェイスの名前を解析し、それぞれのインターフェイスに対して上記のコマンドと同様の処理を行う拡張例を次に示します。

for IFACE in $(ifconfig | sed -nr 's/(^[a-z0-9]+):.*/\1/p'); do \
    echo -en "${IFACE}:\t"; ifconfig | \
    grep -A 7 "$IFACE" | \
    sed 's/  broadcast.*$//' | \
    sed -rn 's/^.*netmask (.*)$/\1/p'; \
done

Ubuntu 18.04の仮想マシンで実行された上記コマンドのサンプル出力:

$ for IFACE in $(ifconfig | sed -nr 's/(^[a-z0-9]+):.*/\1/p'); do echo -en "${IFACE}:\t"; ifconfig | grep -A 7 "$IFACE" | sed 's/..broadcast.*$//' | sed -rn 's/^.*netmask (.*)$/\1/p'; done
ens33:  255.255.255.0
lo:     255.0.0.0
2
pa4080