Score:1

วิธีทำให้สคริปต์ if-up ทำงานเมื่อเสียบสายเคเบิลเท่านั้น

ธง cn

ฉันใช้ Ubuntu 18.04 ในอุปกรณ์ฝังตัวของเรา ฉันตาม https://netplan.io/faq โดยสร้าง "/etc/networkd-dispatcher/routable.d/50-ifup-hooks":

#!/bin/sh

echo "อินเทอร์เฟซขึ้น"
# ทำอะไรสักอย่าง

ทางออก 0

เมื่อเสียบสายเคเบิลเครือข่ายเข้ากับเราเตอร์ สคริปต์จะถูกเรียก ปัญหาคือ สคริปต์นี้ถูกเรียกใช้ทุกๆ 5 วินาทีหลังจากเชื่อมต่อสายเคเบิลฉันต้องการเพียงแค่ "ทำบางอย่าง" เมื่อเสียบสายเครือข่ายเข้ากับเราเตอร์แล้ว แต่ไม่ทำงาน "ทำบางอย่าง" ทุก 5 วินาทีหลังจากเชื่อมต่อสายเคเบิลแล้ว มีวิธีใดที่จะตรวจสอบให้แน่ใจว่ามีการเรียกใช้สคริปต์เมื่อเสียบสายเคเบิลเครือข่ายเข้ากับเราเตอร์แล้ว แต่จะไม่ทำงานเมื่อเชื่อมต่อสายเคเบิลกับเราเตอร์แล้ว

ขอบคุณ!

แก้ไข: นี่คือคำสั่ง ll ในโฟลเดอร์ /etc/networkd-dispatcher:

root@machine:/etc/networkd-dispatcher# ll
รวม 28
drwxr-xr-x 7 รูท รูท 4096 20 ก.ย. 16:04 ./
drwxr-xr-x 77 รูท 4096 ก.ย. 59 18:03 น. ../
drwxr-xr-x 2 รูทรูท 4096 20 ก.ย. 16:05 น. carrier.d/
drwxr-xr-x 2 รูท 4096 15 ต.ค. 2018 dormant.d/
drwxr-xr-x 2 รูทรูท 4096 15 ต.ค. 2018 no-carrier.d/
drwxr-xr-x 2 รูทรูท 4096 20 ก.ย. 07:12 off.d/
drwxr-xr-x 2 รูทรูท 4096 20 ก.ย. 16:04 น. routable.d/

นี่คือคำสั่ง ll สำหรับโฟลเดอร์ carrier.d:

root@machine:/etc/networkd-dispatcher# ll carrier.d/
รวม 12
drwxr-xr-x 2 รูทรูท 4096 20 ก.ย. 16:05 น./
drwxr-xr-x 7 รูท 4096 20 ก.ย. 16:04 น. ../
-rwxr-xr-x 1 รูทรูท 209 ก.ย. 20 16:05 50-ifup-hooks*
Kev Inski avatar
us flag
ตามสคริปต์ `man networkctl` ภายใต้ `routable.d` จะถูกดำเนินการเมื่อ 'ลิงก์มีการกำหนดค่าผู้ให้บริการและที่อยู่กำหนดเส้นทาง' ฉันเดาว่าในการอัปเดตสัญญาเช่าทุกครั้ง สคริปต์จะถูกดำเนินการ ลองวางสคริปต์ในโฟลเดอร์ `carrier.d` - สคริปต์ควรทำงานเมื่อมีผู้ให้บริการเท่านั้น แต่ขึ้นอยู่กับกรณีการใช้งานที่คุณพยายามบรรลุ ชอบ: "ทำบางอย่างเมื่อเสียบสาย" หรือ "ทำบางอย่างเมื่อลิงก์ได้รับที่อยู่ (อาจใหม่)"
cn flag
ขอบคุณ @Kev Inski ว่า "ทำอะไรบางอย่าง" คือ "ทำ DHCP release/renew" สิ่งที่เราต้องการทำคือปล่อย/ต่ออายุ DHCP เมื่อเสียบสายเคเบิลเครือข่ายแล้ว นั่นอธิบายว่าทำไมสคริปต์ถึงถูกเรียก ตามคำแนะนำของคุณ ฉันได้สร้างโฟลเดอร์ /etc/networkd-dispatcher/carrier.d (เนื่องจากไม่มีอยู่ตามค่าเริ่มต้น ไม่แน่ใจว่าถูกต้องหรือไม่โดยสร้างโฟลเดอร์ด้วยตนเอง) จากนั้นฉันย้ายสคริปต์ไปที่โฟลเดอร์ "carrier.d" ฉันเริ่มบริการใหม่ แต่ไม่มีอะไรเกิดขึ้นเมื่อเสียบสาย ฉันทำถูกไหม? มีวิธีที่ดีกว่าในการบรรลุเป้าหมายของฉันหรือไม่?
Kev Inski avatar
us flag
ฉันกำลังตั้งค่า 18.04 VM และลองทดสอบสิ่งนี้ มันค่อนข้างแปลกที่ไม่มีโฟลเดอร์นี้อยู่ แต่ฉันจะตรวจสอบมัน โฟลเดอร์ 'carrier.d' ที่สร้างขึ้นใหม่เป็นของ root ที่มีสิทธิ์ 0755 หรือไม่ สคริปต์สามารถเรียกใช้งานได้และรูทเป็นเจ้าของหรือไม่ คุณอาจต้องการแก้ไขคำถามของคุณ `ll /etc/networkd-dispatcher/` หรืออาจจะเป็น `tree /etc/networkd-dispatcher/` ก็น่าจะดีเช่นกัน เป็นเซิร์ฟเวอร์ 18.04 (เนื่องจากเป็นอุปกรณ์ฝังตัว) หรือเวอร์ชันเดสก์ท็อป "ปกติ"
Kev Inski avatar
us flag
ฉันคิดว่าฉันค้นพบแล้วว่าทำไมสิ่งนี้ถึงใช้งานไม่ได้สำหรับคุณหรือ Ubuntu 18.04 ปัญหาอยู่ในเวอร์ชันของ `systemd` ซึ่งมีเนื้อหาเกี่ยวกับเครือข่าย Ubuntu 18.04 ใช้ systemd เวอร์ชัน 237 โดยที่ Ubuntu 20.04 ใช้เวอร์ชัน 245 ดังนั้นโซลูชันที่ให้มาจะไม่ทำงานเนื่องจากคุณไม่สามารถตรวจพบการเปลี่ยนแปลงสถานะด้วย netplan ทางออกเดียวที่ฉันเห็นคืออัปเกรดเป็น Ubuntu 20.04 (ซึ่งอาจเป็นไปไม่ได้) หรือใช้ `ifupdown` 'เก่า' เพื่อแทนที่ netplan(การติดตั้ง / การคอมไพล์ systemd ด้วยตนเองก็เป็นตัวเลือกเช่นกัน แต่ไม่แนะนำ)
cn flag
ขอบคุณ @Kev Inski การอัปเกรดเป็น Ubuntu 20.04 ไม่ใช่ตัวเลือกในตอนนี้ การเปลี่ยนไปใช้ ifupdown "เก่า" ไม่ใช่ตัวเลือกเช่นกัน ทางออกหนึ่งที่ฉันคิดว่าคือการตรวจสอบสถานะของอินเทอร์เฟซเครือข่าย จาก https://linuxconfig.org/how-to-detect-whether-a-physical-cable-is-connected-to-network-card-slot-on-linux ฉันสามารถใช้ "for i in $( ls /sys/class/net ); do echo -n $i: ; cat /sys/class/net/$i/carrier; done" เพื่อตรวจสอบสถานะอินเทอร์เฟซเครือข่ายเป็นระยะๆ หากสถานะของอินเทอร์เฟซเครือข่ายเปลี่ยนจาก 0 เป็น 1 ฉันจะเรียกใช้ DHCP release/renew คุณคิดว่าจะได้ผลไหม ขอบคุณ.
cn flag
@Kev Inski มีวิธีใดที่เราสามารถบอกความแตกต่างระหว่างปลั๊กสายเคเบิลและการต่ออายุที่อยู่ DHCP ในสคริปต์ carrier.d/50-ifup-hooks หากมีวิธี ฉันทำได้เพียงแค่ปล่อย/ต่ออายุ DHCP สำหรับปลั๊กสายเคเบิล แต่ไม่ใช่สำหรับการอัปเดตที่อยู่ ขอบคุณ.
Score:0
ธง us

บางทีสคริปต์เล็ก ๆ นั้นอาจช่วยคุณได้ ที่สามารถเรียกได้ตามที่ตั้งใจไว้โดย netplan (systemd) จาก routable.ง โฟลเดอร์หากคุณไม่แสดงความคิดเห็น #NETDEV=${IFACE}. แน่นอนว่ามันยังไม่ใช่ขั้นสุดท้ายและต้องการการปรับปรุงเล็กน้อย แต่คุณมีอิสระที่จะใช้มันเป็นพื้นฐาน

#!/bin/bash

NETDEV=enp0s3
#NETDEV=${IFACE}
TMP_FILE=/tmp/link_state-${NETDEV}
OLD_STATE=
HAS_CARRIER="ผู้ให้บริการ"
HAS_NO_CARRIER="NO_CARRIER"

ถ้า [ -e "${TMP_FILE}" ]; แล้ว
    OLD_STATE=$(แมว "${TMP_FILE}")
ไฟ
    
echo "old_state: ${OLD_STATE}"

RESULT=$(ip link แสดง dev "${NETDEV}" | grep '<NO_CARRIER')
RETVAL=$?

ถ้า [ ${RETVAL} -eq 1 ]; แล้ว
    echo "มีผู้ให้บริการ"
    ถ้า [ "${OLD_STATE}" = "${HAS_CARRIER}" ]; แล้ว
        echo "ไม่มีการเปลี่ยนแปลงสถานะ"
    อื่น
        echo -n "${HAS_CARRIER}" > "${TMP_FILE}"
    ไฟ
อื่น
    echo "สถานะ ${NETDEV} ปัจจุบันคือ ${HAS_NO_CARRIER}"
    ถ้า [ "${OLD_STATE}" = "${HAS_NO_CARRIER}" ]; แล้ว
        echo "ไม่มีการเปลี่ยนแปลงสถานะ"
    อื่น
        echo -n "${HAS_NO_CARRIER}" > "${TMP_FILE}"
    ไฟ
ไฟ
cn flag
ขอบคุณ @Kev Inski ฉันไม่ได้แสดงความคิดเห็นในบรรทัด "#NETDEV=${IFACE}" ไม่มีอะไรเกิดขึ้นเมื่อเสียบสาย จากนั้นฉันแก้ไขบรรทัดเพื่อใช้อินเทอร์เฟซของเรา "NETDEV=pan0" เมื่อฉันเสียบสายเคเบิล "if" ตัวแรกจะทำงาน และตัวถัดไป "if" ที่ฝังไว้จะทำงานเช่นกัน อย่างไรก็ตาม หลังจากที่ฉันใส่ "/sbin/dhclient -r /sbin/dhclient" เข้าไปแล้ว โค้ดส่วนนี้ก็วนซ้ำอีกครั้ง นั่นหมายความว่า เมื่อฉันเสียบสายเคเบิล การปลด/ต่ออายุ DHCP จะทำงานทุกๆ 5 วินาทีดังนั้น คำถามคือ มีวิธีบอกความแตกต่างระหว่างเหตุการณ์การเสียบสายเคเบิลและการต่ออายุที่อยู่ DHCP หรือไม่

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา