web-dev-qa-db-ja.com

すべてのネットワークインターフェイスを含む配列をbashで作成する

すべてのアクティブなネットワークインターフェイスを含む配列をBashで作成したいと思います。

Forループを作成してそれらを出力することができましたが、配列を作成しようとすると、最後のloインターフェースのみが含まれ、他のインターフェースは含まれません。これは私のコードです:

#!/bin/bash

for iface in $(ifconfig | cut -d ' ' -f1| tr ':' '\n' | awk NF)
do
           printf "$iface%s\n"
           declare -a array_test=["$iface"]
done
for i in "${array_test[@]}"; do echo "$i"; done

そしてこれが私の出力です:

eno1
eno2
eno3
lo
[lo]

また、lo localhostインターフェイスをアレイから除外するにはどうすればよいですか?

8

これが解決策です。リストを割り当ててから、それにアイテムを追加します。

#!/bin/bash

array_test=()
for iface in $(ifconfig | cut -d ' ' -f1| tr ':' '\n' | awk NF)
do
        printf "$iface\n"
        array_test+=("$iface")
done
echo ${array_test[@]}

出力を1行に1項目表示したい場合:

for i in "${array_test[@]}"; do echo "$i"; done

出力からlocalhostを削除するには:

if [ "$iface" != "lo" ] 
then
    array_test+=("$iface")
fi
9
Kevin Lemaire

私の試み:

readarray -t interfaces < <(ip l | awk -F ":" '/^[0-9]+:/{dev=$2 ; if ( dev !~ /^ lo$/) {print $2}}')
for i in "${interfaces[@]// /}" ; do echo "$i" ; done
5
baselab

bashは、指定した空白(スペース、タブ、改行)で区切られたリストから配列を構築します。例えばarray=(a b c)。コマンド置換($())を使用して、このような空白で区切られたリストを生成できます。例えば:

$ ifaces=( $(ip addr list | awk -F': ' '/^[0-9]/ {print $2}') )

次に、先ほど作成した配列を出力します。

$ declare -p ifaces
declare -a ifaces=([0]="lo" [1]="eth0" [2]="eth1" [3]="br1" [4]="br0" [5]="ppp0")

loを除外するには:

$ ifaces=( $(ip addr list | awk -F': ' '/^[0-9]/ && $2 != "lo" {print $2}') )
$ declare -p ifaces
declare -a ifaces=([0]="eth0" [1]="eth1" [2]="br1" [3]="br0" [4]="ppp0")

ifconfigではなくipを本当に使用したい場合は、以下を試してください:

ifaces=( $(ifconfig | awk -F':'  '/^[^ ]*: / && $1 != "lo" {print $1}') )
3
cas

ifconfigは稼働中のインターフェースのみを出力します。

Linuxでは、/sys/class/netディレクトリにあるインターフェースのリストを取得できます。したがって、zshを使用すると、次のことができます。

interfaces=(/sys/class/net/*(DN:t))

loを除外するには:

set -o extendedglob
interfaces=(/sys/class/net/^lo(DN:t))

upのものに対してのみ、次のことができます。

interfaces=(/sys/class/net/*(DNe{'[[ $(<$REPLY/operstate) = up ]]'}:t)

または、$IFSのデフォルト値を想定しています。

interfaces=($(ip -br link | LC_ALL=C awk '$2 == "UP" {print $1}'))

私のシステムでは、少なくともloのステータスは不明であるため、除外されます。

これは、bashでも機能します。ただし、インターフェース名にワイルドカード文字が含まれていない場合に限ります。 Linux、IIRCの最近のバージョンでは、インターフェイス名にスペースタブと改行文字(デフォルトの$IFS)が含まれないことが保証されているため、これらは問題を引き起こしません。ただし、他のUnicode空白が許可されているため、LC_ALL = Cは、awkがそれらで分割されないことを保証する必要があります。

2

ip(json出力)の '-j'サポートがある場合は、excellentjqユーティリティを使用します。

# ip -j addr show | jq -r .[].ifname
lo
eth0
eth1
tunl0
gre0
gretap0
erspan0
ip_vti0
ip6_vti0
sit0
ip6tnl0
ip6gre0
dummy0
kube-ipvs0
cbr0
vethfbcab624

(kubernetesノードからの例)

1
lgekman