Bash에서 모든 네트워크 인터페이스를 포함하는 배열 만들기

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 인터페이스를 어떻게 제외할 수 있습니까?

답변1

해결 방법은 다음과 같습니다. 목록을 할당한 다음 목록에 항목을 추가합니다.

#!/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[@]}

출력에 한 줄에 하나의 항목을 표시하려면 다음을 수행하십시오.

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

출력에서 localhost를 제거하려면 다음을 수행하십시오.

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

답변2

내 시도:

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

답변3

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}') )

답변4

ip"-j" 지원 (json 출력)이 있는 경우 다음을 사용하세요.훌륭한 jq공공 시설;

# 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

(쿠버네티스 노드의 예)

관련 정보