을 감지하는 방법을 실제 연결 국가의 네트워크 케이블/connector?
-
03-07-2019 - |
문제
Linux 환경에서,나는 감지하는 데 필요한 물리적 연결 또는 분리 상태 RJ45 커넥터를 socket.이용할 수 있는 유용한 기능들을 강타 스크립니다.
다음과 같은 솔루션을 제안되었 다른 사이트에서 작동하지 않는 이 목적을 위해:
- 를 사용하여'ifconfig'-기 때문에 케이블 네트워크에 연결 될 수 있지만 네트워크를 제대로 구성되지 않았거나 현재하지 않습니다.
- 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을 보여줍니다
몇 가지 정밀도와 트
난 이 모든 작업을 수행 할로 정상적인 사용자 (지 루트)
을 잡아에서 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
테스트 주변
/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
을 설치할 수 있습니다.정밀하고,이미 존재해야 합 무언가가 이것에 대해...
에 따라 리눅스 설치, 를 추가할 수 있습니다
if-up
고if-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이됩니다.
이것이 적어도 누군가를 도울 수 있기를 바랍니다!