네트워크 케이블 / 커넥터의 물리적 연결 상태를 감지하는 방법은 무엇입니까?


145

Linux 환경에서 RJ45 커넥터의 물리적 연결 또는 연결 해제 상태를 소켓에 감지해야합니다. BASH 스크립팅 만 사용하는 것이 좋습니다.

다른 사이트에서 제안 된 다음 솔루션은이 목적으로 작동하지 않습니다.

  1. 'ifconfig'사용-네트워크 케이블이 연결되어 있지만 네트워크가 올바르게 구성되지 않았거나 현재 작동하지 않기 때문입니다.
  2. 호스트 핑-제품이 알 수없는 네트워크 구성 및 알 수없는 호스트를 사용하여 LAN 내에 있기 때문에.

/ proc 파일 시스템에서 사용할 수있는 상태가 있습니까 (다른 모든 것이 있습니까)?

Linux 세계는 아이콘 트레이에서 팝업되는 자체 Windows 버전 버블을 어떻게 사용하여 네트워크 케이블을 막았다 고 가정합니까?


켄트 프레드릭 과 로타 , 당신의 대답은 모두 내 필요를 충족시킵니다 ... 많은 감사합니다! 내가 어느 것을 사용할 것인가 ... 나는 아직도 모른다.

나는 당신을 정답으로 둘 수 없다고 생각합니까? 그리고 내가 당신을 선택하는 것이 아마 당신에게 공평합니다. 내가 생각하는 동전을 뒤집어? 다시 한 번 감사합니다!

답변:


228

당신은 노드를보고 싶어

/ sys / class / net /

나는 내 실험 :

전선 연결 :

eth0/carrier:1
eth0/operstate:unknown

와이어 제거 :

eth0/carrier:0
eth0/operstate:down

다시 연결 한 전선 :

eth0/carrier:1
eth0/operstate:up

사이드 트릭 : 한 번에 모든 속성을 쉽게 수확 할 수 있습니다.

grep "" eth0/* 

이것은 멋진 key:value쌍 목록을 형성합니다 .


8
Marco가 아래에 설명했듯이이 값을 쿼리하려면 인터페이스가 구성되어 있더라도 구성되어 있어야합니다.
— Jamie Kitson 13:25에

11
grep ""eth0 / *는 매우 우아하고 쉽습니다. 감사합니다! :) -s 스위치를 사용하면 grep은 디렉토리에 대해 불평하지 않습니다.
— Ray

2
나는 선호한다 : grep -H . eth0/*:이 빈 줄과 인쇄 항목 이름은 각 줄에 속한다.
— F. Hauri

grep의 디렉토리에 대한 오류는 다음과 같이 무시할 수 있습니다.grep -s "" eth0/*
— mrtumnus

인터페이스가 작동해야합니다. 아래 Marco의 답변을 참조하십시오. 내 시스템에서 eth0은 기본적으로 설정되어 있지 않으며 프로그램은 임의로 IP 주소를 생성합니다. 이동 통신사를 캐팅하면 "잘못된 인수"오류가 발생합니다
— VocoJax

84

ethtool 을 사용할 수 있습니다 :

$ sudo ethtool eth0
Settings for eth0:
    Supported ports: [ TP ]
    Supported link modes:   10baseT/Half 10baseT/Full
                            100baseT/Half 100baseT/Full
                            1000baseT/Full
    Supports auto-negotiation: Yes
    Advertised link modes:  10baseT/Half 10baseT/Full
                            100baseT/Half 100baseT/Full
                            1000baseT/Full
    Advertised auto-negotiation: Yes
    Speed: 1000Mb/s
    Duplex: Full
    Port: Twisted Pair
    PHYAD: 0
    Transceiver: internal
    Auto-negotiation: on
    Supports Wake-on: umbg
    Wake-on: g
    Current message level: 0x00000007 (7)
    Link detected: yes

링크 상태 만 얻으려면 grep을 사용할 수 있습니다.

$ sudo ethtool eth0 | grep Link
    Link detected: yes

IP 링크 | grep BROADCAST | cut -d ':'-f 2 | 읽는 동안 i; $ i를 반향하십시오; ethtool $ i | grep 링크; 완료
— Bryan Hunt

3
Marco가 아래에 설명했듯이이 값을 쿼리하려면 인터페이스가 구성되어 있더라도 구성되어 있어야합니다.
— Jamie Kitson

대단해! 이더넷이 사용 가능한지, 이더넷이 연결되어 있는지, 이더넷이 연결되어 있지만 실제 케이블이 연결되어 있는지 확인할 방법이 없는지 이더넷을 사용할 수 있는지 확인하는 방법이있었습니다. grep Link그렇습니다. 감사합니다!!
— ᴛʜᴇᴘᴀᴛᴇʟ

여기서 일하지 않습니다. HP 하드웨어의 Ubuntu 16.04 구성되지 않은 인터페이스는 강제로 up상태가 되어도 "링크 없음" 입니다.
— 0xF2

26

'ip monitor'를 사용하여 REAL TIME 링크 상태를 변경하십시오.


3
제 경우에는 이것이 유일하게 해답입니다 ... / sys / class / net / eth0 / carrier 1는 ip monitor실제로 케이블이 연결되어 있지 않은 상태에서 실제로 무언가를 보여줄 때를 보여줍니다
— Tim Tisdall

이 방법에 대한 확장은 피터에게 감사 할 수있다. 케이블 플러그 상태를 아는 것에 대한 원래의 질문에 대답하는 예와 같은 것.
— Sopalajo de Arrierez

17

cat /sys/class/net/ethX 가장 쉬운 방법입니다.

인터페이스가 작동해야합니다. 그렇지 않으면 잘못된 인수 오류가 발생합니다.

먼저 :

ifconfig ethX up

그때:

cat /sys/class/net/ethX

4
"cat / sys / class / net / eth [n] / operstate"를 시도하십시오. 여기서 [n]은 eth 장치 번호입니다.
— pmont

이것은 eth [n]이 작동하는지 알려줍니다. 아래로 연결되어 있으면 케이블이 연결되어 있는지 여부를 알려주지 않습니다.
— Brice

@Brice, 실제로, 당신 ethX/carrier은 '캐리어'가 감지되면 케이블이 연결되어 있고 데이터를 운반하는 것을 의미하는 1 인 파일을 확인하려고합니다 .
— Alexis Wilke

이것은 케이블이 Android에 연결되어 있는지 확인하기 위해 Process Runtime Exec 명령을 사용하여 나를 위해 일했습니다.
— Arlyn

또는 ifconfig ethX를 설정 한 후 ifconfig ethX를 실행하고 RUNNING을 찾으십시오.
— craig65535

8

낮은 수준에서 이러한 이벤트는 폴링없이 rtnetlink 소켓을 사용하여 잡을 수 있습니다 . 참고 : rtnetlink를 사용하는 경우 udev와 함께 작업해야합니다. 그렇지 않으면 udev가 새 네트워크 인터페이스의 이름을 바꿀 때 프로그램이 혼란 스러울 수 있습니다.

셸 스크립트로 네트워크 구성을 수행 할 때 발생하는 문제는 이벤트 처리에 셸 스크립트가 끔찍 하다는 것입니다 (예 : 네트워크 케이블 연결 및 분리). 보다 강력한 기능이 필요한 경우 네트워크 구성을 위해 설계된 프로그래밍 언어 인 NCD 프로그래밍 언어를 살펴보십시오 .

예를 들어, "케이블 연결"및 "케이블 출력"을 stdout에 인쇄하는 간단한 NCD 스크립트 (인터페이스가 이미 작동한다고 가정) :

process foo {
    # Wait for device to appear and be configured by udev.
    net.backend.waitdevice("eth0");
    # Wait for cable to be plugged in.
    net.backend.waitlink("eth0");
    # Print "cable in" when we reach this point, and "cable out"
    # when we regress.
    println("cable in");   # or pop_bubble("Network cable in.");
    rprintln("cable out"); # or rpop_bubble("Network cable out!");
                           # just joking, there's no pop_bubble() in NCD yet :)
}

(내부적으로 net.backend.waitlink()rtnetlink를 net.backend.waitdevice()사용하고 udev를 사용합니다)

NCD의 개념은 네트워크를 구성하기 위해 독점적으로 사용하므로 일반적으로 구성 명령은 다음과 같은 것입니다.

process foo {
    # Wait for device to appear and be configured by udev.
    net.backend.waitdevice("eth0");
    # Set device up.
    net.up("eth0");
    # Wait for cable to be plugged in.
    net.backend.waitlink("eth0");
    # Add IP address to device.
    net.ipv4.addr("eth0", "192.168.1.61", "24");
}

주목해야 할 중요한 부분은 실행이 회귀 된다는 것입니다 . 예를 들어, 케이블을 뽑으면 IP 주소가 자동으로 제거됩니다.


4

이러한 이벤트를 감지하는 데몬은 두 가지가 있습니다.

ifplugd 및 netplugd


데몬 ifplugstatus에서 도구를 사용 합니다 ifplugd. 인수가 필요하지 않고 입력 만하면 ifplugstatus모든 NIC가 연결되거나 연결 해제됩니다.
— Sopalajo de Arrierez

3

대부분의 최신 Linux 배포판 은이를 위해 NetworkManager 를 사용 합니다. D-BUS를 사용하여 이벤트를 청취 할 수 있습니다.

mii-tool이더넷을 염두에두고 명령 줄 도구로 상태를 확인하려면을 사용할 수도 있습니다 .


3
mii-tool이 ethtool로 대체되었습니다. mii-tool은 GigE 링크를 인식하지 못합니다.
— JimB 2009

또한 대부분의 서버에는 수동으로 구성된 어댑터가 있으며 NM에서는 무시합니다.
— JimB 2009

1
mii-tool인터페이스가 다운되었을 때 링크 상태를보고 할 수있는 유일한 명령 인 것 같습니다.
— donothingsuccessfully

2

이 명령을 사용하여 와이어가 연결되어 있는지 확인하십시오.

cd /sys/class/net/
grep "" eth0/operstate

결과가 위 또는 아래로 표시됩니다. 때로는 알 수없는 것으로 표시되면 확인해야합니다.

eth0/carrier

0 또는 1을 표시합니다


2

일부 정밀도와 요령

  1. 나는이 모든 것을 일반 사용자 ( 루트 아님)로 수행합니다.

  2. 에서 정보를 잡아 dmesg

    사용 dmesg은 시스템의 현재 상태 를 조회하기 위해 가장 먼저해야 할 일 중 하나입니다 .

    dmesg | sed '/eth.*Link is/h;${x;p};d'
    

    다음과 같은 답변을 얻을 수 있습니다.

    [936536.904154] e1000e: eth0 NIC Link is Down
    

    또는

    [936555.596870] e1000e: eth0 NIC Link is Up 100 Mbps Full Duplex, Flow Control: Rx/Tx
    

    상태에 따라 메시지는 사용 된 하드웨어 및 드라이버에 따라 달라질 수 있습니다.

    참고 : 이것은 서면으로 가능 dmesg|grep eth.*Link.is|tail -n1하지만을 사용하는 것을 선호합니다 sed.

    dmesg | sed '/eth.*Link is/h;${x;s/^.*Link is //;p};d'
    Up 100 Mbps Full Duplex, Flow Control: Rx/Tx
    
    dmesg | sed '/eth.*Link is/h;${x;s/^.*Link is //;p};d'
    Down
    
  3. /sys의사 파일 시스템에 대한 테스트

    아래에서 읽거나 쓰면 /sys특히 루트로 실행되는 경우 시스템이 손상 될 수 있습니다 ! 당신은 경고되었습니다 ;-)

    이것은 실제 이벤트 추적이 아닌 풀링 방법 입니다.

    cd /tmp
    grep -H . /sys/class/net/eth0/* 2>/dev/null >ethstate
    while ! read -t 1;do
        grep -H . /sys/class/net/eth0/* 2>/dev/null |
            diff -u ethstate - |
            tee >(patch -p0) |
            grep ^+
      done
    

    다음과 같이 렌더링 할 수 있습니다 (에 따라 플러그를 뽑았다가 다시 꽂았습니다).

    +++ -   2016-11-18 14:18:29.577094838 +0100
    +/sys/class/net/eth0/carrier:0
    +/sys/class/net/eth0/carrier_changes:9
    +/sys/class/net/eth0/duplex:unknown
    +/sys/class/net/eth0/operstate:down
    +/sys/class/net/eth0/speed:-1
    +++ -   2016-11-18 14:18:48.771581903 +0100
    +/sys/class/net/eth0/carrier:1
    +/sys/class/net/eth0/carrier_changes:10
    +/sys/class/net/eth0/duplex:full
    +/sys/class/net/eth0/operstate:up
    +/sys/class/net/eth0/speed:100
    

    ( Enter루프를 종료해야 함)

    참고 : patch설치 해야 합니다.

  4. 벌써, 이것에 대해 뭔가가 있어야합니다 ...

    Linux 설치 에 따라 이러한 종류의 이벤트에 반응 할 수있는 스크립트를 추가 if-up하고 추가 할 수 있습니다 if-down.

    에 데비안 (같은 기반 우분투 ), 당신은에 스크립트를 저장할 수

    /etc/network/if-down.d
    /etc/network/if-post-down.d
    /etc/network/if-pre-up.d
    /etc/network/if-up.d
    

    자세한 내용은 참조하십시오 man interfaces.


문제에 대한 의견과 의견을 보내 주셔서 감사합니다. 그러나 이것들은 '자동화 된'스크립트라는 것을 알고 있습니다. 포인트 2에서 출력 ' 또는 '다른 출력이라고 말하거나 " 상태에 따라 "라고 말하면 사용 된 하드웨어 및 드라이버에 따라 메시지가 달라질 수 있습니다. "... 그것은 큰 문제입니다. 출력이 일정해야하거나 프로덕션 스크립트가 중단되기 시작합니다. 그러나 좋은 정보입니다. 감사합니다.
— Jeach

: @Jeach 출력은 평균 다를 수 있습니다 당신이 아닌 다른 드라이버를 사용할 수 있습니다e1000 및 evenement보다 다른 시간에 발생할 수936555.596870 있지만 따지지는 볼 것이다 NIC Link is.
— F. Hauri

2

ifconfig 를 사용할 수 있습니다 .

# ifconfig eth0 up
# ifconfig eth0

항목에 RUNNING이 표시되면 인터페이스가 물리적으로 연결된 것입니다. 인터페이스 구성 여부에 관계없이 표시됩니다.

이것은에서 정보를 얻는 또 다른 방법입니다 /sys/class/net/eth0/operstate.


당신은 내 시간을 절약했습니다!
— ADITYA VALLURU

1

아치 리눅스에서. (다른 배포판에 대해서는 잘 모르겠습니다) operstate를 볼 수 있습니다. 연결 상태가 아닌 경우 연결되거나 다운되면 표시됩니다.

/sys/class/net/(interface name here)/operstate
#you can also put watch 
watch -d -n -1 /sys/class/net/(interface name here)/operstate

1
tail -f /var/log/syslog | grep -E 'link (up|down)'

또는 나를 위해 더 빨리 얻는다 :

tail -f /var/log/syslog | grep 'link \(up\|down\)'

syslog 파일을 청취합니다.

결과 (연결이 끊긴 후 4 초 후에 다시 연결) :

Jan 31 13:21:09 user kernel: [19343.897157] r8169 0000:06:00.0 enp6s0: link down
Jan 31 13:21:13 user kernel: [19347.143506] r8169 0000:06:00.0 enp6s0: link up

1

"ifconfig eth0 down"칭찬 후 이더넷 케이블이 리눅스에 꽂혀 있는지 확인하려면 어떻게해야합니까? 해결책을 찾았습니다 .ethtool 도구를 사용하십시오.

#ethtool -t eth0
The test result is PASS
The test extra info:
Register test  (offline)         0
Eeprom test    (offline)         0
Interrupt test (offline)         0
Loopback test  (offline)         0
Link test   (on/offline)         0

케이블이 연결되어 있으면 링크 테스트는 0이고 그렇지 않으면 1입니다.


0

OpenWRT Enhanced Device를 리피터 (가상 이더넷 및 무선 LAN 기능 추가)로 사용하고 있었으며 / sys / class / net / eth0 carrier 및 opstate 값이 신뢰할 수 없음을 발견했습니다. 나는 /sys/class/net/eth0.1 및 /sys/class/net/eth0.2와 함께 놀았으며 (적어도 나의 발견에 따르면) 무언가가 물리적으로 연결되어 있고 이더넷 포트. 나는 최소한의 원유이지만 적어도 마지막 재부팅 / 전원 상태 이후에 어떤 것이 꽂혀 있는지 감지하는 믿을만한 방법을 알아 냈습니다 (필자의 경우 정확히 작동했습니다).

ifconfig eth0 | grep -o 'RX packets:[0-9]*' | grep -o '[0-9]*'

마지막으로 전원을 켜거나 재부팅 한 이후에 전원이 연결되어 있지 않은 경우 0이, 전원이 연결되어 있거나 제거 된 이후에도 연결되어 있으면 0보다 큰 값을 얻습니다.

이것이 누군가를 도울 수 있기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.