ネットワークインターフェイス情報を一覧表示できるifconfigコマンドがあることは知っています。しかし、次のパターンで情報を取得したい
Interface_Name IP_Address Net_Mask ステータス (up/down)
例えば
eth0 192.168.1.1 255.255.255.0 ダウン
ifconfig と grep コマンドを試しましたが、正しいパターンを取得できません。これを行うための別のコマンドまたはトリックはありますか?
Pythonは良いです:Dですが、bashで見てみましょう:
Interfaces=`ifconfig -a \
| grep -o -e "[a-z][a-z]*[0-9]*[ ]*Link" \
| perl -pe "s|^([a-z]*[0-9]*)[ ]*Link|\1|"`
for Interface in $Interfaces; do
INET=`ifconfig $Interface | grep -o -e "inet addr:[^ ]*" | grep -o -e "[^:]*$"`
MASK=`ifconfig $Interface | grep -o -e "Mask:[^ ]*" | grep -o -e "[^:]*$"`
STATUS="up"
if [ "$INET" == "" ]; then
INET="-"
MASK="-"
STATUS="down";
fi
printf "%-10s %-15s %-16s %-4s\n" "$Interface" "$INET" "$MASK" "$STATUS"
done
それは非常に簡単です。
ifconfig interface
これは、インターフェイスがダウンしていることを意味する「インターネット アドレスが表示されない」という前提で行われます。
これが役立つことを願っています。
ifconfig
には 2 つの出力モードがあります。デフォルトのモードでは、より多くの出力が得られます。短いモードでは、出力-s
が少なくなります (または、希望する情報とは異なるビットが選択されます)。では、デフォルト モードで ifconfig を使用し、スクリプトで必要な特定の情報をチェリー ピックするのはどうでしょうか (python、perl、ruby、awk、bash+sed+...、ボートを浮かせるものは何でも;-)。例: Python の場合:
import re
import subprocess
ifc = subprocess.Popen('ifconfig', stdout=subprocess.PIPE)
res = []
for x in ifc.stdout:
if not x.strip():
print ' '.join(res)
del res[:]
elif not res:
res.append(re.match(r'\w+', x).group())
else:
mo = re.match(r'\s+inet addr:(\S+).*Mask:(\S+)', x)
if mo:
res.extend(mo.groups())
elif re.match(r'\sUP\s', x):
res.append('up')
elif re.match(r'\sDOWN\s', x):
res.append('down')
if res: print ' '.join(res)
そして、出力はあなたが望むものになるはずです(私が言及した他の言語のいずれかに簡単に翻訳できることを願っています).
ip
コマンドに興味があるかもしれません。次の例では、CIDR 表記で出力するグローバルに有効な IPv4 アドレスに焦点を当てています。
# list interfaces that are up
ip -family inet -oneline addr show scope global | awk '{ printf "%s %s up\n", $2, $4 }'
# list interfaces that are down
ip -family inet -oneline link show scope global | grep ' DOWN ' | sed 's/\://g' | awk '{ printf "%s none down\n", $2}'
(この例では、目的のネットマスク表現が省略されていることに注意してください。)
は非常に強力であるためip
、他のパラメーターを使用してさらにクリーンなソリューションを見つけることができる場合があります。