Puncte:1

Cum se execută scriptul if-up numai când cablul este conectat?

drapel cn

Folosesc Ubuntu 18.04 în dispozitivul nostru încorporat. am urmărit https://netplan.io/faq prin crearea „/etc/networkd-dispatcher/routable.d/50-ifup-hooks”:

#!/bin/sh

echo „Interfață sus”
# Fă ceva

iesirea 0

Când cablul de rețea este conectat la router, scriptul este apelat. Problema este că acest script a fost apelat la fiecare 5 secunde după conectarea cablului.Aș dori doar „Fă ceva” odată ce rețeaua cablată este conectată la router, dar nu rulează „Fă ceva” la fiecare 5 secunde după ce cablul este deja conectat. Există vreo modalitate de a vă asigura că scriptul este apelat doar odată ce cablul de rețea este conectat la router, dar nu este executat atunci când cablul este deja conectat la router?

Mulțumiri!

Editați | ×: Iată comanda ll din folderul /etc/networkd-dispatcher:

root@machine:/etc/networkd-dispatcher# ll
total 28
drwxr-xr-x 7 root root 4096 20 septembrie 16:04 ./
drwxr-xr-x 77 rădăcină rădăcină 4096 16 septembrie 18:03 ../
drwxr-xr-x 2 root root 4096 20 septembrie 16:05 carrier.d/
drwxr-xr-x 2 root root 4096 Oct 15 2018 dormant.d/
drwxr-xr-x 2 root root 4096 Oct 15 2018 no-carrier.d/
drwxr-xr-x 2 root root 4096 20 septembrie 07:12 off.d/
drwxr-xr-x 2 root root 4096 20 septembrie 16:04 routable.d/

Iată comanda ll pentru folderul carrier.d:

root@machine:/etc/networkd-dispatcher# ll carrier.d/
total 12
drwxr-xr-x 2 root root 4096 20 septembrie 16:05 ./
drwxr-xr-x 7 root root 4096 20 septembrie 16:04 ../
-rwxr-xr-x 1 root root 209 20 septembrie 16:05 50-ifup-hooks*
Kev Inski avatar
drapel us
Conform `man networkctl`, scripturile din `routable.d` sunt executate atunci când 'link-ul are configurată o adresă de transportator și de rutare'. Bănuiesc că la fiecare actualizare de închiriere, scriptul este executat. Încercați să puneți scriptul în folderul `carrier.d` - ar trebui să fie executat numai când există un purtător. Dar depinde de cazul de utilizare pe care încercați să îl obțineți. De exemplu: „fă ceva când cablul este conectat” sau „fă ceva când linkul primește o adresă (probabil nouă)”
drapel cn
Mulțumesc @Kev Inski. Acel „Fă ceva” este „Eliberare/reînnoire DHCP”. Ceea ce am vrut să facem este să facem eliberarea/reînnoirea DHCP odată ce cablul de rețea este conectat. Asta explică de ce scriptul este apelat în continuare. Urmând sugestia dvs., am creat folderul /etc/networkd-dispatcher/carrier.d (deoarece nu exista implicit. Nu sunt sigur dacă este corect, creând manual folderul). Apoi am mutat scriptul în folderul „carrier.d”. Am repornit serviciul. Dar nu se întâmplă nimic când cablul este conectat. O fac bine? Există o modalitate mai bună de a-mi atinge scopul?
Kev Inski avatar
drapel us
Configurez un VM 18.04 și încerc să testez asta. Este puțin ciudat că folderul nu a existat, dar mă voi uita la el. Dosarul nou creat `carrier.d` este deținut de root cu permisiuni 0755? Este scriptul executabil și deținut de root. Poate doriți să vă editați întrebarea. `ll /etc/networkd-dispatcher/` sau poate `tree /etc/networkd-dispatcher/` ar fi de asemenea plăcut de văzut. Este un server 18.04 (din moment ce este un dispozitiv încorporat) sau o versiune desktop „normală”?
Kev Inski avatar
drapel us
Cred că am aflat de ce acest lucru nu funcționează pentru tine sau pentru Ubuntu 18.04. Problema constă în versiunea `systemd`, care furnizează elementele de rețea. Ubuntu 18.04 folosește versiunea systemd 237, unde Ubuntu 20.04 folosește versiunea 245. Prin urmare, soluția oferită de mine nu va funcționa, deoarece nu puteți detecta schimbarea stării cu netplan. Singura soluție pe care o văd este fie să fac upgrade la ubuntu 20.04 (ceea ce poate să nu fie posibil), fie să folosesc „vechiul” „ifupdown” pentru a înlocui netplan.(instalarea/compilarea manuală a systemd este, de asemenea, o opțiune, dar nu este recomandată.)
drapel cn
Mulțumesc @Kev Inski. Actualizarea la Ubuntu 20.04 nu este o opțiune deocamdată. Nici trecerea la „vechiul” ifupdown nu este o opțiune. O soluție la care mă gândesc este să verific starea interfețelor de rețea. Pe baza https://linuxconfig.org/how-to-detect-whether-a-physical-cable-is-connected-to-network-card-slot-on-linux, aș putea folosi „for i în $( ls /sys/class/net ); do echo -n $i: ; cat /sys/class/net/$i/carrier; done" pentru a verifica periodic starea interfeței de rețea. Dacă starea oricărei interfețe de rețea s-a schimbat de la 0 la 1, voi rula lansarea/reînnoirea DHCP. Crezi că asta va funcționa? Mulțumiri.
drapel cn
@Kev Inski Există vreo modalitate prin care putem face diferența dintre o mufă de cablu și o reînnoire a adresei DHCP în scriptul carrier.d/50-ifup-hooks? Dacă există o modalitate, atunci pot face doar eliberarea/reînnoirea DHCP pentru mufa cablului, dar nu pentru actualizarea adresei. Mulțumiri.
Puncte:0
drapel us

Poate că acel mic scenariu te poate ajuta. Poate fi numit chiar așa cum este intenționat de netplan (systemd) de la rutabil.d folder dacă anulați comentariul #NETDEV=${IFACE}. Desigur, nu este definitiv și necesită puțină muncă, dar sunteți liber să îl utilizați ca bază.

#!/bin/bash

NETDEV=enp0s3
#NETDEV=${IFACE}
TMP_FILE=/tmp/link_state-${NETDEV}
OLD_STATE=
HAS_CARRIER="CARRIER"
HAS_NO_CARRIER="NO_CARRIER"

dacă [ -e „${TMP_FILE}” ]; atunci
    OLD_STATE=$(pisică „${TMP_FILE}”)
fi
    
echo „stare_veche: ${OLD_STATE}”

REZULTAT=$(link IP arată dev. „${NETDEV}” | grep „<NO_CARRIER”)
RETVAL=$?

dacă [ ${RETVAL} -eq 1 ]; atunci
    echo „are un purtător”
    dacă [ "${OLD_STATE}" = "${HAS_CARRIER}" ]; atunci
        ecou „nicio schimbare de stare”
    altfel
        echo -n „${HAS_CARRIER}” > „${TMP_FILE}”
    fi
altfel
    echo „Starea ${NETDEV} este în prezent ${HAS_NO_CARRIER}”
    dacă [ "${OLD_STATE}" = "${HAS_NO_CARRIER}" ]; atunci
        ecou „nicio schimbare de stare”
    altfel
        echo -n „${HAS_NO_CARRIER}” > „${TMP_FILE}”
    fi
fi
drapel cn
Mulțumesc @Kev Inski Am decomentat linia „#NETDEV=${IFACE}”. Nu se întâmplă nimic când conectez cablul. Apoi am modificat linia pentru a folosi interfața noastră „NETDEV=pan0”. Când am conectat cablul, primul „dacă” a rulat, iar mai departe „dacă” încorporat a fost rulat, de asemenea. Cu toate acestea, după ce am pus „/sbin/dhclient -r /sbin/dhclient” acolo, această parte a codului a fost rulată din nou în buclă. Asta înseamnă că, atunci când conectez cablul, eliberarea/reînnoirea DHCP a început să ruleze la fiecare 5 secunde.Deci întrebarea este, există o modalitate de a face diferența dintre un eveniment de conectare de cablu și o reînnoire a adresei DHCP?

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.