web-dev-qa-db-ja.com

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

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

8
michelemarcon

ここのコードが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のマニュアルページ(バグのセクションを参照)

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

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

7
symcbean

本当にマスクだけ欲しいのかな。たぶん、あなたは本当にネットワーク(または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」になります。

7
mivk

マスクを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"
3
Tim Kennedy
/sbin/ifconfig eth0 | grep Mask | cut -d":" -f4
2
ztank1013

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

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

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

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

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

1
sailnfool