ネットワークケーブル/コネクタの物理的な接続状態を検出する方法
-
03-07-2019 - |
質問
Linux環境では、ソケットへのRJ45コネクタの物理的な接続状態または切断状態を検出する必要があります。できればBASHスクリプトのみを使用してください。
他のサイトで提案されている次の解決策は、この目的では機能しません。
- 「ifconfig」の使用-ネットワークケーブルは接続されているが、ネットワークが適切に構成されていないか、現在稼働していないため。
- ホストへのping-製品は未知のネットワーク構成と未知のホストを使用してLAN内にあるため。
/ procファイルシステムで使用できる状態はありませんか(他のすべてはそこにあります)?
Linuxの世界では、アイコントレイからポップアップする独自のバージョンのWindowsバブルがあり、ネットワークケーブルを取り外したばかりであることを示しています。
Kent Fredric と lothar 、あなたの答えは両方とも私のニーズを満たします。どうもありがとう!どちらを使用するか...まだわかりません。
私はあなたの両方を正しい答えとして置くことはできないと思いますか?そして、おそらくあなたのために私が1つを選ぶことは公平です。コインを裏返す?繰り返します、ありがとう!
解決
ノードを見てみたい
/sys/class/net/
私の実験:
Wire Plugged in:
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 monitor」を使用して、リアルタイムのリンク状態の変更を取得します。
cat / sys / class / net / ethX
が最も簡単な方法です。
ただし、インターフェイスはアップしている必要があります。そうでない場合、無効な引数エラーが発生します。
最初に:
ifconfig ethX up
その後:
cat /sys/class/net/ethX
低レベルでは、これらのイベントは rtnetlink ソケット、ポーリングなし。サイドノート:rtnetlinkを使用する場合、udevと連携する必要があります。さもないと、udevが新しいネットワークインターフェイスの名前を変更するときにプログラムが混乱する可能性があります。
シェルスクリプトを使用してネットワーク構成を行う際の問題は、シェルスクリプトはイベント処理にひどいことです(ネットワークケーブルの抜き差しなど)。もっと強力なものが必要な場合は、 NCDプログラミング言語をご覧ください。ネットワーク構成用に設計されたプログラミング言語。
たとえば、「ケーブルイン」を印刷する単純なNCDスクリプトおよび「ケーブルアウト」 stdoutに(インターフェイスが既に起動していると仮定):
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");
}
注意すべき重要な部分は、実行が退行できることです。たとえば、2番目の例では、ケーブルが引き抜かれた場合、IPアドレスは自動的に削除されます。
これらのイベントを検出する2つのデーモンが存在します:
ifplugd および netplugd
最新のLinuxディストリビューションでは、このために NetworkManager を使用しています。 D-BUSを使用してイベントをリッスンできます。
コマンドラインツールでステータスを確認する場合は、イーサネットを念頭に置いて、 mii-tool
を使用することもできます。
このコマンドを使用して、ワイヤが接続されていることを確認します:
cd /sys/class/net/
grep "" eth0/operstate
結果がアップまたはダウンする場合。不明な場合があります。確認する必要があります
eth0/carrier
0または1を示しています
いくつかの精度とトリック
-
これはすべて通常のユーザーとして( root ではなく)
-
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
状態に応じて、メッセージは使用するハードウェアとドライバーによって異なる場合があります。
注:これは
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
での読み取りまたは書き込みは、特に root として実行している場合、システムを破壊する可能性があります!警告されました;-)これはプーリング方法であり、実際のイベント追跡ではありません。
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
をインストールする必要があります。 -
罰金として、これについてはすでに何かがあるはずです...
Linuxのインストールによっては、
if-up
およびif-down
スクリプトを追加して、この種のイベントに対応できるようにすることができます。Debian ベース( Ubuntu など)では、スクリプトを保存できます
/etc/network/if-down.d /etc/network/if-post-down.d /etc/network/if-pre-up.d /etc/network/if-up.d
詳細については、
manインターフェイス
を参照してください。
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
arch linux。 (他のディストリビューションではわかりません)、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
エントリにRUNNINGと表示されている場合、インターフェイスは物理的に接続されています。これは、インターフェースが構成されているかどうかに関係なく表示されます。
これは、 / sys / class / net / eth0 / operstate
の情報を取得する別の方法です。
OpenWRT拡張デバイスをリピーター(仮想イーサネットとワイヤレスLAN機能を追加)として使用していたところ、/ sys / class / net / eth0キャリアとopstateの値が信頼できないことがわかりました。 /sys/class/net/eth0.1と/sys/class/net/eth0.2をいじってみました(少なくとも私の知る限り)何かが物理的に差し込まれ、話していることを検出する信頼できる方法はありませんでしたイーサネットポートの。少なくとも最後のリブート/パワーオン状態以降に何かがプラグインされているかどうかを検出するための少し粗雑ですが、一見信頼できる方法を見つけました(私の場合は必要に応じて正確に機能しました)。
ifconfig eth0 | grep -o 'RX packets:[0-9]*' | grep -o '[0-9]*'
何もプラグインされておらず、>最後の電源投入またはリブートサイクル以降にプラグインされていた場合(プラグインされてから取り外された場合でも)0。
これは少なくとも誰かの助けになることを願っています!