ifconfg는 활성화된 네트워크 카드를 어떻게 얻나요?

ifconfg는 활성화된 네트워크 카드를 어떻게 얻나요?

한동안 검색을 해봤지만 같은 문제를 찾을 수 있는 명확한 키워드가 없습니다.

내 문제에 대한 간략한 설명:

ifconfig활성화된 NIC만 표시됩니다.

# ifconfig
br0       Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          ...

eth0      Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          inet addr:XX.XX.XX.XX  Bcast:XX.XX.XX.XX  Mask:XX.XX.XX.XX
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          ...

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          ...

그러나 ip addr모든 NIC가 표시됩니다.

# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> ... UNKNOWN 
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> ... state UP
3: eth1: <BROADCAST,MULTICAST> ... state DOWN
8: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> ... state UNKNOWN

화면 출력을 기반으로 ifconfig문자열을 통해 네트워크 카드가 활성화되어 있는지 알 수 있습니다.위로. (예: 루프백,위로,LOWER_UP)

내가 아는 한 이 문자열은 하드웨어와 아무런 관련이 없습니다. 그러므로 둘 다 답 이 /sys/class/net/NIC/operstate아닙니다 ./sys/class/net/NIC/carrier


내 질문은: 그 밧줄은 어디서 오는가?

(파일 시스템의 일부 파일에 포함되어 있다고 추측합니다.)

답변1

man ifconfig설명하다:

ifconfig는 커널 상주 네트워크 인터페이스를 구성하는 데 사용됩니다. 필요에 따라 인터페이스를 설정하기 위해 시작 시 사용됩니다. 그 이후에는 일반적으로 디버깅할 때나 시스템 조정이 필요할 때만 필요합니다.

인수가 지정되지 않으면 ifconfig는 현재 활성 인터페이스의 상태를 표시합니다.

단일 인터페이스 매개변수가 제공되면 해당 인터페이스의 상태만 표시됩니다.

단일 -a 인수가 제공되면 작동 중지된 인터페이스까지 포함하여 모든 인터페이스의 상태가 표시됩니다.

그렇지 않으면 인터페이스를 구성합니다.

man netdevice또한 이 문제에 대한 몇 가지 단서를 공유할 수도 있습니다. ioctl() 시스템 호출을 사용합니다.

또 다른 기술은 을 사용하는 것입니다 strace.

이는 전달한 프로그램에서 수행한 모든 시스템 호출 목록과 해당 인수 및 반환 값을 제공합니다. 프로그램이 오랫동안 실행되기보다는 일부 정보를 덤프하고 종료하는 경우 검색 중인 정보를 제공할 수 있는 것처럼 보이는 모든 시스템 호출에 대해 man을 수행하는 것은 매우 간단합니다.

내가 달릴 때

strace ifconfig

몇 가지 흥미로운 호출은 다음과 같습니다.

open("/proc/net/dev", O_RDONLY)         = 6

다음은 ioctl의 묶음입니다.

ioctl(5, SIOCGIFFLAGS, {ifr_name="eth0", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0
ioctl(5, SIOCGIFHWADDR, {ifr_name="eth0", ifr_hwaddr=12:cd:4b:bb:7f:39}) = 0
ioctl(5, SIOCGIFMETRIC, {ifr_name="eth0", ifr_metric=0}) = 0
ioctl(5, SIOCGIFMTU, {ifr_name="eth0", ifr_mtu=9001}) = 0

답변2

도움을 주셔서 감사합니다. 이것은 내 테스트 코드입니다.

check_ifup.c

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>

int main(int argc, char* argv[])
{
    if (argc < 2)
    {   
        printf("Usage: ./check_ifup interface_name\n");
        return 0;
    }   

    struct ifreq ifr;
    int sockfd;

    sockfd = socket(AF_INET, SOCK_DGRAM, 0); 
    bzero(&ifr, sizeof(ifr));
    strcpy(ifr.ifr_name, argv[1]);
    ioctl(sockfd, SIOCGIFFLAGS, &ifr);

    if (ifr.ifr_flags & IFF_UP)    
        printf("%s is up\n", argv[1]);
    else
        printf("%s is down or unknown\n", argv[1]);                                                            

    close(sockfd);
    return 0
}

인용하다:

  1. 인터페이스 플래그 정의
  2. ifconfig.c
  3. 일부 튜토리얼(중국어)
  4. IFF_UP과 IFF_RUNNING의 차이점

관련 정보