문제

Linux 환경에서,나는 감지하는 데 필요한 물리적 연결 또는 분리 상태 RJ45 커넥터를 socket.이용할 수 있는 유용한 기능들을 강타 스크립니다.

다음과 같은 솔루션을 제안되었 다른 사이트에서 작동하지 않는 이 목적을 위해:

  1. 를 사용하여'ifconfig'-기 때문에 케이블 네트워크에 연결 될 수 있지만 네트워크를 제대로 구성되지 않았거나 현재하지 않습니다.
  2. Ping 호스트 이후의 제품이 될 것입니다 LAN 에서 사용하는 알 수 없는 네트워크 구성을 알 수 없는 호스트.

없는 상태에서 사용할 수있는/proc 파일 시스템(다른 모든 것은 거기에있는)?

는 방법은 리눅스 세계로 가는 자신의 버전의 Windows 거품에서 팝업 아이콘 트레이 나타내는 그냥 뽑을 네트워크 케이블?


켄트 프레드릭로타, 모두 당신의 답변을 충족 나야...많은 감사!는 내가 사용하...나는 아직도 알지 못한다.

나중에 당신을 넣어 모두 아래로 올바른 대답은?와 아마 당신을 위해 공정하는 나는 하나를 선택합니다.동전 던지기 것 같아요?다시 감사합니다!

도움이 되었습니까?

해결책

당신은 노드를보고 싶습니다

/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 한 쌍.

다른 팁

당신이 사용할 수있는 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 모니터'를 사용하여 실시간 링크 상태 변경을 얻으십시오.

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

인터페이스는 위로 올라 가야합니다. 그렇지 않으면 잘못된 인수 오류가 발생합니다.

그래서 먼저 :

ifconfig ethX up

그 다음에:

cat /sys/class/net/ethX

낮은 수준에서 이러한 이벤트는 사용하여 잡을 수 있습니다. 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 주소가 자동으로 제거됩니다.

이 사건을 감지하는 두 개의 데몬이 있습니다.

ifplugd 그리고 netplugd

대부분의 최신 Linux 배포판이 사용됩니다 NetworkManager 이것을 위해. D-BU를 사용하여 이벤트를들을 수 있습니다.

상태를 확인하기위한 명령 줄 도구를 원한다면 사용할 수도 있습니다. mii-tool, 당신이 이더넷을 염두에두고 있다는 것을 감안할 때.

이 명령을 사용하여 와이어가 연결되어 있는지 확인합니다.

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

결과가 위 또는 아래로 나올 경우. 때로는 알 수없는 것을 보여 주면 확인해야합니다.

eth0/carrier

0 또는 1을 보여줍니다

몇 가지 정밀도와 트

  1. 난 이 모든 작업을 수행 할로 정상적인 사용자 (지 루트)

  2. 을 잡아에서 infos dmesg

    dmesg 은 하나의 1 할을 위해 문의 현재 상태 의 시스템:

    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
    

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

    Nota:이 수여 작성 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
    

    (히 입력 exit loop)

    Nota:이 필요 patch 을 설치할 수 있습니다.

  4. 정밀하고,이미 존재해야 합 무언가가 이것에 대해...

    에 따라 리눅스 설치, 를 추가할 수 있습니다 if-upif-down 스크립트는 반응 할 수 있는 종류의 이벤트입니다.

    데비안 기반(아 Ubuntu다),당신을 저장할 수 있고 스크립트로

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

    man interfaces 에 대한 더 많은 정보.

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

아치 리눅스에서. (다른 배포판에 대해서는 확실하지 않습니다) Operstate를 볼 수 있습니다. Operstate가 생명이 아닌 경우 연결되거나 아래로 나타납니다.

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

~할 수 있다 ifconfig를 사용하십시오.

# ifconfig eth0 up
# ifconfig eth0

항목이 실행되는 경우 인터페이스가 물리적으로 연결됩니다. 인터페이스가 구성되어 있는지 여부에 관계없이 표시됩니다.

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

OpenWrt Enhanced 장치를 리피터 (가상 이더넷 및 무선 LAN 기능을 추가)로 사용하여/SYS/CLASS/NET/ETH0 캐리어 및 OPSTATE 값이 신뢰할 수 없음을 발견했습니다. 나는 /sys/class/net/eth0.1 및 /sys/class/net/eth0.2를 가지고 놀았으며 (적어도 내 발견에) 무언가가 물리적으로 꽂혀 있고 어떤 것에 대해 이야기하는지 감지 할 수있는 신뢰할 수있는 방법이 없습니다. 이더넷 포트의. 나는 마지막 재부팅/Poweron State 이후로 어떤 것이 꽂혀 있는지 여부를 감지 할 수있는 약간의 조잡한 방법을 알아 냈습니다 (제 경우에는 필요한대로 정확하게 작동했습니다).

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

마지막 전원 켜기 또는 재부팅 사이클 이후에 꽂혀 있지 않은 경우 (아무것도 연결되어 있고 제거 된 이후에도)가 꽂혀 있으면 0이됩니다.

이것이 적어도 누군가를 도울 수 있기를 바랍니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top