Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

aide pour script bash

8 réponses
Avatar
François Patte
Bonjour,

Je ne connais pas bien tous les dessous de bash, mais j'aimerais savoir
s'il est possible de donner plusieurs noms à une variable.

Le problème: un script iptables sur un ordi qui fonctionne soit en
liaison filaire (interface externe eth0) soit en wifi (interface externe
wlan0). Pour l'instant j'ai deux scripts l'un pour eth0 et l'autre pour
wlan0 qui n'ont comme différence que le nom de l'interface externe.
J'aimerais n'en avoir qu'un en déclarant par exemple:

INTERFACE_EXTERNE={eth0|wlan0}

Mais je ne sais pas si c'est possible et je ne sais pas quels seraient
les "bons" mots clé pour trouver la réponse.

Merci pour toute aide.
--
François Patte
Université Paris Descartes

8 réponses

Avatar
Yliur
Le Sat, 29 Aug 2015 12:06:58 +0200
François Patte a écrit :

Bonjour,

Je ne connais pas bien tous les dessous de bash, mais j'aimerais
savoir s'il est possible de donner plusieurs noms à une variable.

Le problème: un script iptables sur un ordi qui fonctionne soit en
liaison filaire (interface externe eth0) soit en wifi (interface
externe wlan0). Pour l'instant j'ai deux scripts l'un pour eth0 et
l'autre pour wlan0 qui n'ont comme différence que le nom de
l'interface externe. J'aimerais n'en avoir qu'un en déclarant par
exemple:

INTERFACE_EXTERNE={eth0|wlan0}

Mais je ne sais pas si c'est possible et je ne sais pas quels seraient
les "bons" mots clé pour trouver la réponse.

Merci pour toute aide.



Avec une boucle ou une fonction par exemple ?

Est-ce qu'exécuter les lignes dans un ordre très précis est important
ou est-ce que tu peux exécuter toutes les règles pour eth0 puis celles
pour wlan0 ?
Avatar
François Patte
Le 29/08/2015 13:10, Yliur a écrit :
Le Sat, 29 Aug 2015 12:06:58 +0200
François Patte a écrit :

Bonjour,

Je ne connais pas bien tous les dessous de bash, mais j'aimerais
savoir s'il est possible de donner plusieurs noms à une variable.

Le problème: un script iptables sur un ordi qui fonctionne soit en
liaison filaire (interface externe eth0) soit en wifi (interface
externe wlan0). Pour l'instant j'ai deux scripts l'un pour eth0 et
l'autre pour wlan0 qui n'ont comme différence que le nom de
l'interface externe. J'aimerais n'en avoir qu'un en déclarant par
exemple:

INTERFACE_EXTERNE={eth0|wlan0}

Mais je ne sais pas si c'est possible et je ne sais pas quels seraient
les "bons" mots clé pour trouver la réponse.

Merci pour toute aide.



Avec une boucle ou une fonction par exemple ?

Est-ce qu'exécuter les lignes dans un ordre très précis est important
ou est-ce que tu peux exécuter toutes les règles pour eth0 puis celles
pour wlan0 ?




Je ne sais pas si je me suis bien fait comprendre: voilà une règle:

/sbin/iptables -A INPUT -i $INTERFACE_EXTERNE -p tcp -m multiport
--sport 80,443 -m state --state ESTABLISHED,RELATED -j ACCEPT

Et j'aimerais que la variable $INTERFACE_EXTERNE soit comprise comme
étant l'une des interfaces dans la liste: eth0, wlan0



--
François Patte
Université Paris Descartes
Avatar
Francois Lafont
Bonjour,

On 29/08/2015 14:41, François Patte wrote:

Je ne sais pas si je me suis bien fait comprendre: voilà une règle:

/sbin/iptables -A INPUT -i $INTERFACE_EXTERNE -p tcp -m multiport
--sport 80,443 -m state --state ESTABLISHED,RELATED -j ACCEPT

Et j'aimerais que la variable $INTERFACE_EXTERNE soit comprise comme
étant l'une des interfaces dans la liste: eth0, wlan0



Désolé mais je crois que ce n'est hélas toujours pas très clair.
Tu veux que ta variable contienne soit "eth0" soit "wlan0" mais
comment veux-tu que le choix entre les deux se fasse ? Car au
final durant une exécution particulière du script j'imagine que
la variable possèdera une seule et même valeur (soit "eth0" soit
"wlan0"). Mais suivant quelle procédure tu veux que le choix se
fasse ? Il faut que tu décrives en bon français comment tu veux
que le choix se fasse et ensuite peut-être des que des personnes
pourront te dire comment implémenter ça en bash. Mais là c'est
vraiment trop flou. Tel que le problème est décrit, il y a 1001
façons de d'avoir une variable qui vaut soit "eth0" soit "wlan0" :
cela peut-être via un argument passé au script, cela peut être un
choix en fonction de l'heure (après 18h00 c'est "wlan0", avant
c'est "eth0") etc. etc.

Pour le cas où le nom de l'interface est passé en argument du
script, ça pourrait donner un truc comme ça :

---------------------------
#!/bin/bash

# IFACE contient comme valeur l'argument passé au script.
IFACE="$1"

if ! echo -n "$IFACE" | grep -qE -e '^(eth0|wlan0)$'
then
echo "Sorry, your argument must be eth0 or wlan0, that's all. Bye."
exit 1
fi

# Suite... avec la variable IFACE dans le code.
---------------------------

De cette manière, ton script pourra être appelé :
- soit comme ça « ton-script "eth0" »
- soit comme ça « ton-script "wlan0" »

Donc là, la valeur de la variable est décidée par l'utilisateur
du script via un argument passé au script en question. Mais
j'ignore si c'est ce genre de chose qui te convient car, encore
une fois, tu n'as pas expliqué du tout comment tu voulais que le
choix de la valeur de cette variable devait se faire.

--
François Lafont
Avatar
YBM
Le 29/08/2015 07:06, François Patte a écrit :
Bonjour,

Je ne connais pas bien tous les dessous de bash, mais j'aimerais savoir
s'il est possible de donner plusieurs noms à une variable.

Le problème: un script iptables sur un ordi qui fonctionne soit en
liaison filaire (interface externe eth0) soit en wifi (interface externe
wlan0). Pour l'instant j'ai deux scripts l'un pour eth0 et l'autre pour
wlan0 qui n'ont comme différence que le nom de l'interface externe.
J'aimerais n'en avoir qu'un en déclarant par exemple:

INTERFACE_EXTERNE={eth0|wlan0}

Mais je ne sais pas si c'est possible et je ne sais pas quels seraient
les "bons" mots clé pour trouver la réponse.



en Wi-Fi :

$ INTERFACE_EXTERNE=$( ip route show | grep ^default | cut -d' ' -f5 )
$ echo $INTERFACE_EXTERNE
wlan0

en Filaire :

$ INTERFACE_EXTERNE=$( ip route show | grep ^default | cut -d' ' -f5 )
$ echo $INTERFACE_EXTERNE
eth0
Avatar
Eric Masson
Francois Lafont writes:

'Lut,

Tu veux que ta variable contienne soit "eth0" soit "wlan0" mais
comment veux-tu que le choix entre les deux se fasse ?



Et ce machin n'est pas foutu de travailler sur des groupes d'interfaces,
que ceux-ci soient déclarés explicitement ou implicitement (voir
l'interface egress sur un OpenBSD pf raisonnablement récent) ?

Cela éviterait les bidouilles à base de shell script...

--
SP> Ah désolé, mais alors là Tristant il a bu le filtre
Non, le philtre. C'est pas pareil. Je te renvoie à fr.sci.filo
pour que tu conçoives la diphérence.
-+- TP in Guide du neuneu sur Usenet - C'est phou, non ? -+-
Avatar
Eric Masson
François Patte writes:

'Lut,

Merci pour toute aide.



Si Netfilter le supporte, une autre approche serait amha plus propre, à
savoir une pseudo interface bond gérant le failover entre ethernet et
Wifi © .

http://crunchbang.org/forums/viewtopic.php?idt98

Dès lors le filtrage se ferait sur l'interface bond, indépendamment du
lien actif.

--
« Excusez-moi, je n'ai pas pu m'en empêcher... »
-+- CF in GNU - fufe, c'est plus fort que toi -+-
Avatar
François Patte
Le 29/08/2015 18:53, YBM a écrit :
INTERFACE_EXTERNE=$( ip route show | grep ^default | cut -d' ' -f5 )



Merci! Voilà qui rend mon script portable! Avec tous les noms des
interfaces internet qui pullulent maintenant: eno1, wlp6s0, etc.

--
François Patte
Université Paris Descartes
Avatar
Bruno Ducrot
Bonjour,

On 2015-08-30, François Patte wrote:
Le 29/08/2015 18:53, YBM a écrit :
INTERFACE_EXTERNE=$( ip route show | grep ^default | cut -d' ' -f5 )



Merci! Voilà qui rend mon script portable! Avec tous les noms des
interfaces internet qui pullulent maintenant: eno1, wlp6s0, etc.




ip route show match 0.0.0.0/0
Afin d'éviter le grep.

A plus,

--
Bruno Ducrot

A quoi ca sert que Ducrot hisse des carcasses ?