물리적 이더넷 인터페이스의 이름만 얻는 방법은 무엇입니까?

물리적 이더넷 인터페이스의 이름만 얻는 방법은 무엇입니까?

물리적 이더넷 인터페이스의 이름(가상 이더넷 인터페이스가 아닌)만 얻을 수 있는 방법이 있습니까?
몇 가지 배경 지식을 제공하기 위해 일부 SBC(RPi 3)가 해당 IP 주소를 데이터베이스에 기록하도록 하려고 합니다. 하지만 서로 다른 SBC의 물리적 이더넷 인터페이스는 이름이 다른 경우가 많기 때문에 해당 IP 주소를 얻는 것이 어려웠습니다.
이 문제를 해결하기 위해 제가 생각할 수 있는 한 가지 방법은 모든 SBC 이더넷 인터페이스에 eth0과 같은 공통 이름을 지정하는 것입니다. 하지만 이 방식은 다소 투박한 느낌이 듭니다. 그렇다면 물리적 이더넷 인터페이스의 이름을 얻는 대안이 있습니까?

답변1

어떤 인터페이스가 가상인지 알 수 있습니다.

ls -l /sys/class/net/

그러면 다음과 같은 출력이 제공됩니다.

[root@centos7 ~]# ls -l /sys/class/net/
total 0
lrwxrwxrwx. 1 root root 0 Mar 20 08:58 ens33 -> ../../devices/pci0000:00/0000:00:11.0/0000:02:01.0/net/ens33
lrwxrwxrwx. 1 root root 0 Mar 20 08:58 lo -> ../../devices/virtual/net/lo
lrwxrwxrwx. 1 root root 0 Mar 20 08:58 virbr0 -> ../../devices/virtual/net/virbr0
lrwxrwxrwx. 1 root root 0 Mar 20 08:58 virbr0-nic -> ../../devices/virtual/net/virbr0-nic

여기에서 grep을 사용하여 가상이 아닌 인터페이스만 필터링할 수 있습니다.

ls -l /sys/class/net/ | grep -v virtual

또 다른 옵션은 다음에서 수정된 이 작은 스크립트를 사용하는 것입니다.이 답변, 이는 MAC 주소 00:00:00:00:00:00, 즉 물리적인 주소가 없는 모든 인터페이스의 이름을 인쇄합니다.

#!/bin/bash

for i in $(ip -o link show | awk -F': ' '{print $2}')
do
    mac=$(ethtool -P $i)
    [[ $mac != *"00:00:00:00:00:00"* ]] && echo "$i"
done

답변2

에서 영감을 받다기존 답변, 유용한 /sys/class/net디렉토리의 이름을 지정하고ls를 사용하지 말라는 경고그리고 주변 자료가 아닌 이름만 보면 되므로 다음과 같은 단일 명령을 생각해 냈습니다.

find /sys/class/net -mindepth 1 -maxdepth 1 -lname '*virtual*' -prune -o -printf '%f\n'

그러면 모든 비루프백 및 비가상 인터페이스 목록이 제공됩니다.

$ find /sys/class/net -mindepth 1 -maxdepth 1 -lname '*virtual*' -prune -o -printf '%f\n'
eth1
eth0

답변3

그러면 물리적 장치의 이름이 제공됩니다. 나는 awk가 여러 장치에서 작동하지 않는다고 생각합니다. 그러나 awk를 제거하면 모든 실제 이름 목록이 표시됩니다.

lshw -class network | grep -A 1 "bus info" | grep name | awk -F': ' '{print $2}'

답변4

루프백이 없는 "깨끗한 인터페이스 목록"이 필요합니다.

나는 "일"이라고 생각하는 두 가지 방법을 생각해 냈습니다.

find /sys/class/net -type l -execdir basename '{}' ';' | grep -v "^lo$"

(지침: udev가 심볼릭 링크를 생성한 모든 실제 장치를 찾아 파일 이름과 인터페이스 이름인 "basename"을 가져옵니다. | "lo"인 줄은 모두 제거하세요.)

! ! ! Bash 스크립트에서 "ls"를 사용하지 마십시오

그리고

arp | awk '{ if ( NR > 1  ) { print } }' | awk '{print $5}' | sed '/^$/d'| sort -u

(지침: arp 테이블 정보 제공 | 행 1이 arp 테이블 제목인 경우 인쇄하지 않음 | 다섯 번째 열만 인쇄 | 빈 행 삭제 | 중복 항목을 알파벳순으로 정렬하고 삭제)

arp 명령을 사용하면 "이더넷" 장치를 지정할 수 있습니다.

arp -t ether

이것이 "가상 장치"를 제거할지 확실하지 않습니다. 확실히 내 Wi-Fi 네트워크 인터페이스가 포함되어 있습니다. "깨끗한 이름 목록"을 사용하면 대부분의 다른 명령에 연결하고 모두 0인 MAC 주소 또는 가상 속성을 테스트할 수 있습니다.

"ls" 구문 분석에 대한 답변이 많이 있습니다. 정말 해서는 안되는 일입니다. 네트워크 인터페이스의 이름은 일반적인 방식을 깨지 않는 방식으로 지정되었을 가능성이 높습니다(예: 공백, 줄 바꿈, 기타 이상한 문자...). 또한 find, arp, awk, sed 및 sort는 일반적으로 모든 Linux 장치에 이미 있습니다.

저는 Kubuntu 노트북에서만 명령을 테스트했습니다. 아무도 나에게 돈을 지불하지 않으며 그것이 오늘 내가 가진 시간입니다. 또한 네트워크 인터페이스의 이름도 알아야 하며 개별 네트워크 장치를 인식하지 못하고 전체 존재가 완전히 추상적인 인스턴스에서 arp 인터페이스를 사용하게 됩니다.

관련 정보