كيفية الكشف عن المادية متصل الدولة من كابل الشبكة/موصل ؟
-
03-07-2019 - |
سؤال
في بيئة لينكس ، أحتاج إلى كشف المادية متصل أو غير متصل الدولة من موصل RJ45 مأخذ.ويفضل استخدام باش البرمجة فقط.
الحلول التالية التي اقترحت على مواقع أخرى لا تعمل لهذا الغرض:
- باستخدام 'ifconfig' - منذ كابل الشبكة قد تكون مرتبطة ولكن الشبكة لم يتم تكوين بشكل صحيح أم لا حاليا ما يصل.
- بينغ المضيف منذ أن المنتج سوف يكون في غضون LAN باستخدام شبكة غير معروفة التكوين و معروف المضيفين.
أليس هناك بعض الدول التي يمكن استخدامها في /proc نظام الملفات (كل شيء آخر هو في هناك) ؟
كيف هو العالم لينكس من المفترض أن يكون النسخة الخاصة بهم من النوافذ الفقاعة التي يطفو على السطح من رمز علبة مشيرا إلى أن لقد موصول شبكة الكابل ؟
كينت فريدريك و وثار, سواء من إجاباتك تلبية حاجتي...شكرا جزيلا!أي واحد سوف تستخدم...ما زلت لا أعرف.
أعتقد أنني لا يمكن أن يضع لك كلا لأن الإجابة الصحيحة ؟ و ربما العادلة لك أن أفعل اختيار واحد.الوجه عملة على ما أعتقد ؟ مرة أخرى, شكرا!
المحلول
كنت تريد أن تبدو في العقد في
/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
فقط على الرابط الحالة يمكنك استخدام البقرى:
$ sudo ethtool eth0 | grep Link
Link detected: yes
استخدام الملكية الفكرية مونيتور' للحصول على الوقت الحقيقي حالة ربط التغييرات.
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");
}
الجزء المهم هو أن نلاحظ أن تنفيذ مسموح التراجع;في المثال الثاني ، على سبيل المثال ، إذا كان الكابل سحب عنوان IP تلقائيا إزالتها.
هناك اثنين من الشياطين أن الكشف عن هذه الأحداث:
ifplugd و netplugd
أحدث توزيعات لينكس استخدام مدير الشبكات من أجل هذا.هل يمكن استخدام D-BUS للاستماع الأحداث.
إذا كنت ترغب في أداة سطر الأوامر للتحقق من حالة ، يمكنك أيضا استخدام mii-tool
, بالنظر إلى أن لديك إيثرنت في الاعتبار.
أنا استخدم هذا الأمر للتحقق من سلك متصل:
cd /sys/class/net/
grep "" eth0/operstate
إذا كانت النتيجة ستكون أعلى أو لأسفل.في بعض الأحيان يظهر غير معروف, ثم تحتاج إلى التحقق من
eth0/carrier
فإنه يدل على 0 أو 1
بعض توضيحات و الحيل
أنا أفعل كل هذا المستخدم العادي (لا الجذر)
انتزاع معلومات من
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
يمكن كسر النظام الخاص بك, خاصة إذا كان تشغيل الجذر!لقد تم تحذيرك ;-)هذا هو تجميع الأسلوب ليس حقيقي تتبع الحدث.
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
(ضرب أدخل للخروج من حلقة)
الملاحظه:هذا يتطلب
patch
أن يكون مثبتا.جيد, هناك يجب أن يكون بالفعل شيئا عن هذا...
اعتمادا على تثبيت لينكس, يمكنك إضافة
if-up
وif-down
النصوص أن تكون قادرة على الرد على هذا النوع من الأحداث.على دبيان على أساس (مثل أوبونتو), هل يمكن تخزين البرامج النصية الخاصة بك في
/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 تعزيز جهاز مكرر (الذي يضيف الظاهري إيثرنت lan اللاسلكية قدرات) وجدت أن /sys/class/net/eth0 الناقل opstate القيم لا يمكن الاعتماد عليها.لقد لعبت حوالي مع /sys/class/net/eth0.1 /sys/class/net/eth0.2 وكذلك مع (على الأقل إلى إيجاد) لا يمكن الكشف عن أن شيئا ما كان جسديا في الوتر و الكلام على أي من منافذ إيثرنت.اكتشفت قليلا الخام ولكن على ما يبدو طريقة يمكن الاعتماد عليها للكشف عن إذا كان أي شيء قد تم في الوتر منذ آخر إعادة التشغيل/poweron الدولة على الأقل (التي عملت بالضبط كما كنت في حاجة إليها في حالتي).
ifconfig eth0 | grep -o 'RX packets:[0-9]*' | grep -o '[0-9]*'
سوف تحصل على 0 إذا لم يكن هناك شيء في الوتر شيئا > 0 إذا كان أي شيء في الوتر (حتى لو كان في الوتر منذ إزالتها) منذ آخر على السلطة أو إعادة تشغيل دورة.
آمل أن يساعد هذا شخص على الأقل!