Si, mais quand $reason = PREINIT comme déjà dit.
çà je ne sais pas où le mettre !?
Dans le script, et pas lié au if sur $interface.
Si, mais quand $reason = PREINIT comme déjà dit.
çà je ne sais pas où le mettre !?
Dans le script, et pas lié au if sur $interface.
Je ne vois paque ce que viennent faire l’echo et l’exec.
l’echo c’est pour que les erreurs s’inscrivent dans un fichier si la connexion ne se fait pas. Le 'exec c’est pour terminer le script.
J’ai mis le ‹ fi › à la fin de la ligne correspondant à l’ajout de la route.
J’ai mis la parenthèse à la fin de la syntaxe ‹ case ›.
#!/bin/bash
# Si l'interface est ce qui est entre crochet : enxb827ebf0443a alors une route dans la table de routage n°100 par défaut sur la passerelle 192.168.1.1 sera ajoutée #
if [ “${interface}” = “enxb827ebf0443a” ]; then
# lorsque l'interface ethernet sera configurée en DHCP#
case “${reason}” in BOUND)
route add default via 192.168.1.1 table 100
fi
case "$reason" = PREINIT)
rule add from 192.168.1.0/24 table 100
rule add to 192.168.1.0/24 table main
Ça ne va pas.
Il manque le fi pour terminer le if.
La syntaxe du case est incorrecte.
Si tu comptes utiliser un case avec $reason, il faut le mettre autour du if sur l’interface, et pas dedans.
Je ne vois paque ce que viennent faire l’echo et l’exec.
Je ne sais pourquoi ma réponse s’est intercalée entre les deux précédents messages ?
J’ai modifié le script.
l’echo c’est pour que les erreurs s’inscrivent dans un fichier si la connexion ne se fait pas. Le 'exec c’est pour terminer le script.
Ton echo
ne fait qu’écrire le texte qui suit sur la sortie standard, pas la sortie d’erreur.
exec
sans commande ne termine pas le script, et sa redirection de la sortie d’erreur dans un fichier ne va rien écrire puisque la seule commande qui suit est exit
qui termine le script. Il faudrait le mettre au début du script.
Je ne sais pourquoi ma réponse s’est intercalée entre les deux précédents messages ?
Tu as modifié ton message au lieu d’en créer un nouveau.
J’ai modifié le script.
Il y a encore des erreurs et des maladresses.
La syntaxe des case
n’est toujours pas bonne, il manque les ;;
à la fin de chaque liste de commande et les esac
pour terminer les case
. D’autre part case
n’est intéressant que s’il y a plusieurs valeurs d’une expression à tester, ce qui n’est pas le cas ici, donc un simple if
suffirait. Tu pourrais utiliser un case
sur $reason
en le mettant en premier, et faire le if
sur $interface
dans le cas ou $reason
est égal à PREINIT
.
script 1
#!/bin/bash
# L'interface ethernet est configurée donc une nouvelle route est ajoutée
case “${reason}” in BOUND | “${interface}” = “enxb827ebf0443a”)
route add default via 192.168.1.1 table 100
;;
esac
# PREINIT : dhcpcd démarre et toute pré-initialisation est terminée.
if [ "$reason" = PREINIT ]
then
rule add from 192.168.1.0/24 table 100
rule add to 192.168.1.0/24 table main
fi
J’ai fait un deuxième script qui reprend ce que tu me conseilles de faire :
Script2
#!/bin/bash
# Tu pourrais utiliser un `case` sur `$reason` en le mettant en premier
case “$reason” in BOUND)
rule add from 192.168.1.0/24 table 100
rule add to 192.168.1.0/24 table main
;;
esac
# et faire le `if` sur `$interface` dans le cas ou `$reason` est égal à `PREINIT`
if [ “${interface}” = “enxb827ebf0443a” ] && [ "$reason" = PREINIT ]
then
route add default via 192.168.1.1 table 100
fi
Et comme les deux précédents ne me plaisent pas j’en ai fait un troisième
Script 3:
#!/bin/bash
# la route doit être ajoutée uniquement lorsque l’interface ethernet est configurée, soit si $interface = enxb827ebf0443a et $reason = BOUND (si DHCP) ou STATIC
if [ “${interface}” = “enxb827ebf0443a" ]; then
case “${reason}” in BOUND | STATIC)
route add default via 192.168.1.1 table 100
;;
esac
fi
# et les deux règles ne doivent être ajoutées qu’une seule fois au démarrage, donc si
if [ "${reason}=PREINIT ]; then
rule add from 192.168.1.0/24 table 100
rule add to 192.168.1.0/24 table main
fi
Je sens qu’on n’y arrivera pas de cette façon, il va falloir que je te montre quand j’aurais un moment…
Entendu. Merci
Voilà, quelque chose comme ceci :
#!/bin/sh
# si tu veux des logs d'erreur
exec 2> /var/log/routage_avance.log
case “$reason” in
PREINIT)
ip rule add from 192.168.1.0/24 table 100
ip rule add to 192.168.1.0/24 table main
;;
BOUND)
if [ “$interface” = “enxb827ebf0443a” ] ; then
ip route add default via 192.168.1.1 table 100
fi
;;
esac
Merci. J’en suis effectivement encore bien loin ! Mais ça m’a intrigué et amusé. Je t’en remercie car je vais creuser l’affaire.
Je teste demain. Et comme j’ai des logs, je vais voir ce qui se passe.
Il y a quelque chose que je n’ai encore pas dû faire correctement :
# nano /etc/dhcpcd.exit-hook
copier-coller du script
# chmod +x /etc/dhcpcd.exit-hook
#reboot
Cela ne fonctionne pas. Aucun accès exterieur. J’ai voulu aller voir dans le fichier log 'routage_avance.log". Rien
Tu peux regarder si quelque chose a été ajouté avec
ip rule
ip route ls table 100
Tu peux aussi instrumenter le script en ajoutant ceci :
echo $(date) reason="$reason" interface="$interface" >> /var/log/dhcpcd.exit-hook.log
et regarder ce que contient /var/log/dhcpcd.exit-hook.log après le démarrage.
# ip rule
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
root@raspberrypi:/home/pi# ip route ls table 100
root@raspberrypi:/home/pi#
J’ai ajouté la ligne au début du script, juste en dessous de ‹ exec 2> /var/log/routage_avance.log ›
J’ai voulu aller voir dans le fichier log 'routage_avance.log". Rien
Le fichier a été créé au moins ? Si oui ça veut au moins dire que le script est exécuté.
oui il a été créé. Je m’absente une ou deux heures.
/var/log/dhcpcd.exit-hook.log
pi@raspberrypi:~ $ cat /var/log/dhcpcd.exit-hook.log
Fri Jul 16 14:06:05 BST 2021 reason=STOPPED interface=wlan0
Fri Jul 16 14:06:05 BST 2021 reason=STOPPED interface=enxb827ebf0443a
Fri Jul 16 14:06:12 BST 2021 reason=PREINIT interface=enxb827ebf0443a
Fri Jul 16 14:06:12 BST 2021 reason=NOCARRIER interface=enxb827ebf0443a
Fri Jul 16 14:06:12 BST 2021 reason=PREINIT interface=wlan0
Fri Jul 16 14:06:12 BST 2021 reason=NOCARRIER interface=wlan0
Fri Jul 16 14:06:15 BST 2021 reason=CARRIER interface=enxb827ebf0443a
Fri Jul 16 14:06:21 BST 2021 reason=BOUND interface=enxb827ebf0443a
Fri Jul 16 14:11:58 BST 2021 reason=STOPPED interface=wlan0
Fri Jul 16 14:11:58 BST 2021 reason=STOPPED interface=enxb827ebf0443a
Fri Jul 16 14:12:04 BST 2021 reason=PREINIT interface=enxb827ebf0443a
Fri Jul 16 14:12:04 BST 2021 reason=NOCARRIER interface=enxb827ebf0443a
Fri Jul 16 14:12:05 BST 2021 reason=PREINIT interface=wlan0
Fri Jul 16 14:12:05 BST 2021 reason=NOCARRIER interface=wlan0
Fri Jul 16 14:12:07 BST 2021 reason=CARRIER interface=enxb827ebf0443a
Fri Jul 16 14:12:13 BST 2021 reason=BOUND interface=enxb827ebf0443a
$ ip rule
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
pi@raspberrypi:~ $ ip route ls table 100
pi@raspberrypi:~ $
Toujours rien dans le fichier ‹ routage_avance.log ›
pi@raspberrypi:~ $ cat /var/log/routage_avance.log
pi@raspberrypi:~ $
Trouvé. Je ne sais comment, les guillemets normaux ont été changés en guillemets « pas normaux » lorsque j’ai copié le script dans le forum.
Par contre l’instrumentation révèle que dhcpcd ne se comporte pas comme je pensais : il appelle le script avec reason=PREINIT
pour chaque interface, ce qui n’est pas bon car les commandes ip rule
ne doivent être exécutées qu’une fois en tout et pour tout.
Nouvelle version :
if [ "$interface" = "enxb827ebf0443a" ] ; then
case "$reason" in
PREINIT)
ip rule add from 192.168.1.0/24 table 100
ip rule add to 192.168.1.0/24 table main
;;
BOUND)
ip route add default via 192.168.1.1 table 100
;;
esac
fi
Je teste…
pi@raspberrypi:~ $ cat /var/log/dhcpcd.exit-hook.log
Fri Jul 16 14:06:05 BST 2021 reason=STOPPED interface=wlan0
Fri Jul 16 14:06:05 BST 2021 reason=STOPPED interface=enxb827ebf0443a
Fri Jul 16 14:06:12 BST 2021 reason=PREINIT interface=enxb827ebf0443a
Fri Jul 16 14:06:12 BST 2021 reason=NOCARRIER interface=enxb827ebf0443a
Fri Jul 16 14:06:12 BST 2021 reason=PREINIT interface=wlan0
Fri Jul 16 14:06:12 BST 2021 reason=NOCARRIER interface=wlan0
Fri Jul 16 14:06:15 BST 2021 reason=CARRIER interface=enxb827ebf0443a
Fri Jul 16 14:06:21 BST 2021 reason=BOUND interface=enxb827ebf0443a
Fri Jul 16 14:11:58 BST 2021 reason=STOPPED interface=wlan0
Fri Jul 16 14:11:58 BST 2021 reason=STOPPED interface=enxb827ebf0443a
Fri Jul 16 14:12:04 BST 2021 reason=PREINIT interface=enxb827ebf0443a
Fri Jul 16 14:12:04 BST 2021 reason=NOCARRIER interface=enxb827ebf0443a
Fri Jul 16 14:12:05 BST 2021 reason=PREINIT interface=wlan0
Fri Jul 16 14:12:05 BST 2021 reason=NOCARRIER interface=wlan0
Fri Jul 16 14:12:07 BST 2021 reason=CARRIER interface=enxb827ebf0443a
Fri Jul 16 14:12:13 BST 2021 reason=BOUND interface=enxb827ebf0443a
Fri Jul 16 21:33:02 BST 2021 reason=STOPPED interface=wlan0
Fri Jul 16 21:33:02 BST 2021 reason=STOPPED interface=enxb827ebf0443a
Fri Jul 16 21:33:08 BST 2021 reason=PREINIT interface=enxb827ebf0443a
Fri Jul 16 21:33:08 BST 2021 reason=NOCARRIER interface=enxb827ebf0443a
Fri Jul 16 21:33:09 BST 2021 reason=PREINIT interface=wlan0
Fri Jul 16 21:33:09 BST 2021 reason=NOCARRIER interface=wlan0
Fri Jul 16 21:33:11 BST 2021 reason=CARRIER interface=enxb827ebf0443a
Fri Jul 16 21:33:16 BST 2021 reason=BOUND interface=enxb827ebf0443a
$ ip rule
0: from all lookup local
32764: from all to 192.168.1.0/24 lookup main
32765: from 192.168.1.0/24 lookup 100
32766: from all lookup main
32767: from all lookup default
$ ip route ls table 100
default via 192.168.1.1 dev enxb827ebf0443a
Je suppose qu’au vu des résultats des commandes il est inutile d’ajouter que tout fonctionne parfaitement !!!
Merci
les commandes
ip rule
ne doivent être exécutées qu’une fois en tout et pour tout.
Non, pas nécessairement.
Si tu précises la priorité / le numéro de la règle de routage, la règle ne sera inscrite qu’une seule fois (du moment que c’est toujours le même contenu).
D’ailleurs, la commande retournera 0.
Par exemple :
ip -4 rule add prio 31000 from 192.168.1.0/24 table 100
ip -4 rule add prio 31001 to 192.168.1.0/24 table main
Et si on ajoute deux règles de contenu différent avec la même priorité, cela marche aussi. Les règles sont ajoutées puis éventuellement supprimées en mode FIFO.
Par exemple, imaginons que tu veuilles remplacer la règle de routage de priorité 1000, tu peux faire :
ip -4 rule add prio 1000 from 192.168.1.0/24 table 100
ip -4 rule del prio 1000
–
AnonymousCoward