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


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 1ip 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

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

ifplugdnetplugd


데몬 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 출력은 평균 다를 수 있습니다 당신이 아닌 다른 드라이버를 사용할 수 있습니다e1000evenement보다 다른 시간에 발생할 수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.