كيفية الكشف عن المادية متصل الدولة من كابل الشبكة/موصل ؟

StackOverflow https://stackoverflow.com/questions/808560

سؤال

في بيئة لينكس ، أحتاج إلى كشف المادية متصل أو غير متصل الدولة من موصل RJ45 مأخذ.ويفضل استخدام باش البرمجة فقط.

الحلول التالية التي اقترحت على مواقع أخرى لا تعمل لهذا الغرض:

  1. باستخدام 'ifconfig' - منذ كابل الشبكة قد تكون مرتبطة ولكن الشبكة لم يتم تكوين بشكل صحيح أم لا حاليا ما يصل.
  2. بينغ المضيف منذ أن المنتج سوف يكون في غضون 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

بعض توضيحات و الحيل

  1. أنا أفعل كل هذا المستخدم العادي (لا الجذر)

  2. انتزاع معلومات من 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
    
  3. اختبار حول /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 أن يكون مثبتا.

  4. جيد, هناك يجب أن يكون بالفعل شيئا عن هذا...

    اعتمادا على تثبيت لينكس, يمكنك إضافة 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 إذا كان أي شيء في الوتر (حتى لو كان في الوتر منذ إزالتها) منذ آخر على السلطة أو إعادة تشغيل دورة.

آمل أن يساعد هذا شخص على الأقل!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top