Linux環境では、ソケットへのRJ45コネクタの物理的な接続状態または切断状態を検出する必要があります。できればBASHスクリプトのみを使用してください。
他のサイトで提案されている次の解決策は、この目的では機能しません。
/ procファイルシステムで使用できる状態はありませんか(他のすべてはそこにあります)?
Linuxの世界では、ネットワークケーブルを取り外したばかりであることを示すアイコントレイからポップアップする独自のバージョンのWindowsバブルをどのように想定していますか?
ケント・フレドリック そして ロシャール、あなたの答えは両方とも私のニーズを満たします...どうもありがとう!どれを使うか...まだわかりません。
私はあなたを正しい答えとして両方を置くことはできないと思いますか?そして、おそらくあなたのために私が1つを選ぶことは公平です。コインを裏返す?繰り返しますが、ありがとう!
あなたはノードを見てみたい
/sys/class/net /
私は私のものを試しました:
差し込まれたワイヤー:
eth0/carrier:1
eth0/operstate:unknown
削除されたワイヤー:
eth0/carrier:0
eth0/operstate:down
再び差し込まれたワイヤー:
eth0/carrier:1
eth0/operstate:up
Side Trick:簡単な方法ですべてのプロパティを一度に収穫する:
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スクリプト(インターフェイスが既に起動していると仮定):
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");
}
注意すべき重要な部分は、実行がregress;たとえば、2番目の例では、ケーブルが引き出されると、IPアドレスが自動的に削除されます。
これらのイベントを検出する2つのデーモンがあります。
ifplugdおよびnetplugd
このコマンドを使用して、ワイヤが接続されていることを確認します。
cd /sys/class/net/
grep "" eth0/operstate
結果がアップまたはダウンする場合。時々それは未知を示します、そして次に確認する必要があります
eth0/carrier
0または1を示します
私はこれをすべて通常のユーザーとして(notroot)
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
疑似ファイルシステムをテストする
特にrootとして実行すると、/sys
cの下で読み取りまたは書き込みを行うと、システムが破損する可能性があります。あなたは警告されました;-)
これはプーリング方式であり、実際のイベントトラッキングではありません。
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 interfaces
を参照してください。
最新のLinuxディストリビューションのほとんどは、このために NetworkManager を使用します。 D-BUSを使用してイベントをリッスンできます。
コマンドラインツールでステータスを確認する場合は、イーサネットを念頭に置いて、mii-tool
を使用することもできます。
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
can 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が、プラグインされている場合(プラグインされてから取り外された場合でも)> 0が返されます。
これが少なくとも誰かの助けになることを願っています!