W środowisku Linux muszę wykryć stan fizycznego podłączenia lub odłączenia złącza RJ45 do gniazda. Najlepiej używać tylko skryptów BASH.
NIE sprawdzają się w tym celu następujące rozwiązania, które zostały zaproponowane na innych stronach:
- Korzystanie z 'ifconfig' - ponieważ kabel sieciowy może być podłączony, ale sieć nie jest poprawnie skonfigurowana lub nie jest aktualnie uruchomiona.
- Pinguj hosta - ponieważ produkt będzie znajdować się w sieci LAN przy użyciu nieznanej konfiguracji sieci i nieznanych hostów.
Czy nie ma jakiegoś stanu, którego można użyć w systemie plików / proc (wszystko inne jest tam)?
Jak świat Linuksa ma mieć własną wersję bańki Windows, która wyskakuje z zasobnika ikon, wskazując, że właśnie odłączyłeś kabel sieciowy?
Kent Fredric i Lothar , obie twoje odpowiedzi zaspokajają moją potrzebę ... wielkie dzięki! Którego użyję ... Nadal nie wiem.
Chyba nie mogę was oboje uznać za poprawną odpowiedź? I prawdopodobnie to dla ciebie sprawiedliwe, że wybiorę jedną. Chyba rzucić monetą? Jeszcze raz dzięki!
źródło
grep -H . eth0/*
To whipe emty lines i print entry name with należą do każdego wiersza.grep -s "" eth0/*
Możesz użyć ethtool :
Aby uzyskać tylko status łącza, możesz użyć grep:
źródło
grep Link
czy to. Dziękuję Ci!!up
.Użyj „monitora ip”, aby uzyskać zmiany stanu łącza w CZASIE RZECZYWISTYM.
źródło
1
kiedy mój kabel jest odłączony, podczas gdyip monitor
faktycznie coś pokazujecat /sys/class/net/ethX
jest zdecydowanie najłatwiejszą metodą.Interfejs musi być jednak włączony, w przeciwnym razie pojawi się błąd nieprawidłowego argumentu.
Więc najpierw:
Następnie:
źródło
ethX/carrier
który ma wartość 1, jeśli zostanie wykryty 'nośnik', co oznacza, że kabel jest podłączony i przenosi dane ...Na niskim poziomie zdarzenia te można przechwytywać za pomocą gniazd rtnetlink , bez żadnego odpytywania. Uwaga dodatkowa: jeśli używasz rtnetlink, musisz współpracować z udev, w przeciwnym razie twój program może się pomylić, gdy udev zmieni nazwę nowego interfejsu sieciowego.
Problem z konfiguracją sieci za pomocą skryptów powłoki polega na tym, że skrypty powłoki są straszne przy obsłudze zdarzeń (takich jak podłączanie i odłączanie kabla sieciowego). Jeśli potrzebujesz czegoś mocniejszego, spójrz na mój język programowania NCD, język programowania przeznaczony do konfiguracji sieciowych.
Na przykład prosty skrypt NCD, który wypisze „cable in” i „cable out” na stdout (zakładając, że interfejs jest już włączony):
(wewnętrznie
net.backend.waitlink()
używa rtnetlink inet.backend.waitdevice()
używa udev)Ideą NCD jest to, że używasz go wyłącznie do konfigurowania sieci, więc zwykle polecenia konfiguracyjne pojawiałyby się pomiędzy, takimi jak:
Ważną częścią, na którą należy zwrócić uwagę, jest to, że wykonanie może się cofnąć ; w drugim przykładzie, na przykład, jeśli kabel zostanie wyciągnięty, adres IP zostanie automatycznie usunięty.
źródło
Istnieją dwa demony, które wykrywają te zdarzenia:
ifplugd i netplugd
źródło
ifplugstatus
narzędzia zifplugd
demona. Nie potrzebujesz argumentów, po prostu wpisz,ifplugstatus
a otrzymasz całą kartę sieciową jako podłączoną lub odłączoną.Większość nowoczesnych dystrybucji Linuksa używa do tego NetworkManagera . Możesz użyć D-BUS do nasłuchiwania wydarzeń.
Jeśli chcesz, aby narzędzie wiersza poleceń sprawdzało stan, możesz również użyć
mii-tool
, biorąc pod uwagę, że masz na myśli Ethernet.źródło
mii-tool
wydaje się być jedynym poleceniem, które może raportować stan łącza, gdy interfejs jest wyłączony.Używam tego polecenia, aby sprawdzić, czy przewód jest podłączony:
Jeśli wynik będzie w górę lub w dół. Czasami pokazuje nieznane, wtedy musisz sprawdzić
Pokazuje 0 lub 1
źródło
Trochę precyzji i sztuczek
Robię to wszystko jako zwykły użytkownik (nie root )
Pobierz informacje z
dmesg
Użycie
dmesg
jest jedną z pierwszych rzeczy do zrobienia w celu sprawdzenia aktualnego stanu systemu:mógłby odpowiedzieć na przykład:
lub
w zależności od stanu, komunikat może się różnić w zależności od używanego sprzętu i sterowników.
Uwaga: można to napisać,
dmesg|grep eth.*Link.is|tail -n1
ale wolę używaćsed
.Przetestuj
/sys
pseudosystemy plikówCzytanie lub pisanie poniżej
/sys
może zepsuć twój system, zwłaszcza jeśli działa jako root ! Zostałeś ostrzeżony ;-)To jest metoda łączenia, a nie rzeczywiste śledzenie zdarzeń .
Może wyrenderować coś takiego (po odłączeniu i ponownym podłączeniu, w zależności od):
(Naciśnij, Enteraby wyjść z pętli)
Uwaga: to wymaga
patch
zainstalowania.W porządku, musi już być coś w tym ...
W zależności od instalacji Linuksa możesz dodać
if-up
iif-down
skrypty, aby móc reagować na tego typu zdarzenia.W systemie Debian (takim jak Ubuntu ) możesz przechowywać swoje skrypty w
zobacz
man interfaces
więcej informacji.źródło
e1000
a wieczór może nastąpić w innym czasie niż936555.596870
, ale zawsze zobaczyszNIC Link is
.Państwo może używać ifconfig.
Jeśli wpis pokazuje RUNNING, interfejs jest fizycznie podłączony. Będzie to widoczne niezależnie od tego, czy interfejs jest skonfigurowany.
To tylko kolejny sposób na uzyskanie informacji
/sys/class/net/eth0/operstate
.źródło
na arch Linux. (nie jestem pewien w innych dystrybucjach) możesz wyświetlić operstate. który pojawia się, jeśli jest podłączony lub wyłączony, jeśli nie, operstate żyje
źródło
lub dla mnie szybciej dostaje:
Będzie nasłuchiwać pliku syslog.
Wynik (w przypadku rozłączenia i ponownego podłączenia po 4 sekundach):
źródło
Jakoś, jeśli chcesz sprawdzić, czy kabel Ethernet jest podłączony do linuxa po poleceniu: "ifconfig eth0 down". Znajduję rozwiązanie: użyj narzędzia ethtool.
jeśli kabel jest podłączony, test łącza wynosi 0, w przeciwnym razie 1.
źródło
Używałem mojego ulepszonego urządzenia OpenWRT jako repeatera (który dodaje możliwości wirtualnej sieci Ethernet i bezprzewodowej sieci LAN) i stwierdziłem, że wartości nośnika i opstate / sys / class / net / eth0 były niewiarygodne. Bawiłem się /sys/class/net/eth0.1 i /sys/class/net/eth0.2 z (przynajmniej według moich ustaleń) żadnym niezawodnym sposobem wykrycia, że coś jest fizycznie podłączone i rozmawia portów Ethernet. Wymyśliłem nieco prymitywny, ale pozornie niezawodny sposób na wykrycie, czy coś zostało podłączone przynajmniej od ostatniego restartu / stanu zasilania (co działało dokładnie tak, jak tego potrzebowałem w moim przypadku).
Otrzymasz 0, jeśli nic nie zostało podłączone i coś> 0, jeśli coś zostało podłączone (nawet jeśli zostało podłączone i od tego czasu usunięte) od ostatniego włączenia lub ponownego uruchomienia.
Mam nadzieję, że to przynajmniej komuś pomoże!
źródło