回答:
ここのコードがLinuxで機能することを明確にする必要があります(他のUnicesに関するコメントと投稿に注意してください)。OPはLinuxソリューションを求めましたが、質問を「ネットマスクを取得する方法」に一般的に変更し、より多くのUnixフレーバーのための最良の方法を組み合わせて回答するのは良いことです。
#!/bin/sh
ifconfig "$1" | sed -rn '2s/ .*:(.*)$/\1/p'
./script eth0
netstat、arp、rarp、routeなどの他の従来のネットワークコマンドに加えて、ifconfigはnet-toolsパッケージの一部です。net-toolsは非常に長い間積極的に開発されておらず、新しい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
。
マスクを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"
/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'
マスクを16進数で出力します。
デフォルトのネットワークデバイスのネットマスクを探している場合、デフォルトのデバイスはeth0ではない可能性があるため、このコマンドはデフォルトのデバイスを返します。
netdevice=$(ip r | grep default | awk '/default/ {print $5}')
そして、このコマンドはマスクを取得します:
netmask=$(ifconfig "$netdevice" | awk '/netmask/{ print $4;}')
Eliah KaganとPaulo Tomeのおかげで、答えを単純化および明確化することができました。私の個人用マシンでは、デフォルトのイーサネットデバイスは「wlx504654c1a91」でした。これは複雑すぎて覚えて正確に入力することができないため、2段階のプロセスが必要です。
grep 'pattern' | awk '{ action }'
通常、次のように削減できますawk '/pattern/ { action }'
ifconfig
sネットマスク行は次のinet 192.168.144.120 netmask 0xffffff00 broadcast 192.168.144.255
ようになります。したがって、答えは簡単に調整できますが、おそらくone-size-fits-allはありません(Bash / ifconfigのみを使用)。 。