#1 Le 31/10/2016, à 14:10
- Bybeu
Extraire le premier et le n ième mot d'une sortie de commande ?
Bonjour
J'ai commencé par faire un script pour remplacer des lignes iptables en extrayant le n° de ligne:
N=`iptables -nvL INPUT|grep bla|grep blo|grep DROP|cut -d" " -f1`
iptables -R INPUT $N....-j DROP; N=
Mais maintenant j'ai besoin de prendre en compte que l'interface graphique de gestion peut me remplacer par exemple DROP par logdrop alors il me faudrait une deuxième variable. La place est limitée alors je voudrais éviter ce genre de lourdeur:
N=`iptables -nvL INPUT|grep bla|grep blo|grep -i DROP|cut -d" " -f1`
T=`iptables -nvL INPUT|grep bla|grep blo|grep -i DROP|cut -d" " -f4`
iptables -R INPUT $N....-j $T; N=; T=
Comment récupérer ces 2 variables pour que ça soit moins gros que la somme des 2 lignes ?
Je pourrais en plus aussi utiliser des fonctions pour toutes les chaînes répétées de nombreuses fois.
J'ai lu des trucs sur read (elle est bonne) mais j'y comprends rien, même avec -e ça marche pas
PS : j'ai le $IFS qui est égal à espace
Merci
Dernière modification par Bybeu (Le 31/10/2016, à 14:10)
Hors ligne
#2 Le 31/10/2016, à 14:24
- k3c
Re : Extraire le premier et le n ième mot d'une sortie de commande ?
Bonojur
Pour y voir plus clair, tu peux poster le résultat de
iptables -nvL
Je pense que l'on doit pouvoir utiliser moins de grep successifs.
Debian 12 sur Thinkpad reconditionné
Hors ligne
#3 Le 31/10/2016, à 14:34
- Bybeu
Re : Extraire le premier et le n ième mot d'une sortie de commande ?
J'ai bien peur que non, j'ai déjà ratatiné au max pour pas prendre de risques:
1 8 572 DROP 0 -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID
2 0 0 ACCEPT icmp -- vlan2 * 0.0.0.0/0 0.0.0.0/0 limit: avg 1/sec burst 5
3 0 0 DROP icmp -- vlan2 * 0.0.0.0/0 0.0.0.0/0
4 16316 3161K ACCEPT 0 -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
5 0 0 DROP udp -- vlan2 * 0.0.0.0/0 0.0.0.0/0 udp dpt:520
6 0 0 DROP udp -- br+ * 0.0.0.0/0 0.0.0.0/0 udp dpt:520
7 0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:520
8 0 0 DROP tcp -- !lo * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
9 2108 126K ACCEPT tcp -- !br1 * 0.0.0.0/0 ip.lan.du.routeur tcp dpt:443 flags:0x17/0x02 state NEW
10 0 0 logbrute tcp -- vlan2 * 0.0.0.0/0 ip.lan.du.routeur tcp dpt:22
11 0 0 ACCEPT tcp -- vlan2 * 0.0.0.0/0 ip.lan.du.routeur tcp dpt:22
12 0 0 DROP 2 -- * * 0.0.0.0/0 0.0.0.0/0
13 5954 447K ACCEPT 0 -- br0 * 0.0.0.0/0 0.0.0.0/0 state NEW
14 3 183 ACCEPT 0 -- lo * 0.0.0.0/0 0.0.0.0/0 state NEW
15 0 0 ACCEPT udp -- br1 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67
16 0 0 ACCEPT udp -- br1 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
17 0 0 ACCEPT tcp -- br1 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
18 389 41629 DROP 0 -- * * 0.0.0.0/0 0.0.0.0/0
Hors ligne
#4 Le 31/10/2016, à 14:40
- Watael
Re : Extraire le premier et le n ième mot d'une sortie de commande ?
salut,
grep + cut = awk
et, effectivement, tous ces ces grep c'est pas bien; mais c'est pas grave, puisque maintenant tu vas utiliser awk !
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#5 Le 31/10/2016, à 14:46
- Bybeu
Re : Extraire le premier et le n ième mot d'une sortie de commande ?
Et je pourrais sortir le numéro de ligne et la target en ignorant la casse en une seule ligne plus courte que la somme des deux ? C'est à combiner avec printf ?
Tu me donnes un exemple pour remplacer ça:
#(Add br1 to existing DROP udp520 br0 rule)
N=`iptables -nvL INPUT --line-numbers|grep br|grep t:520|cut -d" " -f1` #suffisant pour identification univoque de N
T=`iptables -nvL INPUT --line-numbers|grep br|grep t:520|grep -i DROP|cut -d" " -f4`
iptables -R INPUT $N -p udp -i br+ --dp 520 -j $T; N=;T=
Dernière modification par Bybeu (Le 31/10/2016, à 15:20)
Hors ligne
#6 Le 31/10/2016, à 15:08
- k3c
Re : Extraire le premier et le n ième mot d'une sortie de commande ?
avec awk, le numéro de ligne est
$1
c'est à dire le premier mot de la ligne
et il faut tester si le 4 ème mot de la ligne est DROP
Debian 12 sur Thinkpad reconditionné
Hors ligne
#7 Le 31/10/2016, à 15:11
- Bybeu
Re : Extraire le premier et le n ième mot d'une sortie de commande ?
Pas la peine de tester, c'est bien le champ 4 de la sortie -nvL, c'est sûr :
1 ligne
2 pkts
3 bytes
4 target
OOppps, j'ai pas bien lu . Donc ça sera $4 à l'utilisation. Mais comment j'identifie la ligne sur laquelle travailler ?
Je peux pas faire du traitement sur place car je n'ai pas iptables-save, seulement restore, donc je suis obligé de faire avec -L à l'entrée et -R|A|D|I à la sortie
Dernière modification par Bybeu (Le 31/10/2016, à 15:34)
Hors ligne
#8 Le 31/10/2016, à 16:29
- MicP
Re : Extraire le premier et le n ième mot d'une sortie de commande ?
iptables -R INPUT $N....-j $T; N=; T=
Je ne sais pas ce que tu compte mettre à la place de la suite de points,
mais si ce qui s'affiche en lançant les commandes suivantes corresponds à la ligne de commandes qui t'intéresse,
tu n'aura qu'à supprimer la commande echo
Les lignes de commandes suivantes ne modifieront rien sur ton système,
elles ne font qu'afficher des retours de commandes.
bla="br+"; blo="drop"; blu="dpt:520";
iptables -nvL INPUT --line-numbers | awk 'BEGIN{IGNORECASE = 1}; /'"${bla}"'/ && /'"${blo}"'/ && /'"${blu}"'/ { system("echo iptable -R INPUT "$1"....-j "$4) }'
Ci-dessus, j'ai utilisé des variables (bla blo blu), mais ce n'est pas indispensable.
iptables -nvL INPUT --line-numbers | awk 'BEGIN{IGNORECASE = 1}; /br+/ && /drop/ && /dtp:520/ { system("echo iptable -R INPUT "$1"....-j "$4) }'
EDIT : J'avais aussi oublié "--line-numbers"
Dernière modification par MicP (Le 31/10/2016, à 16:39)
Hors ligne
#9 Le 31/10/2016, à 16:35
- Bybeu
Re : Extraire le premier et le n ième mot d'une sortie de commande ?
Merci
Je vais essayer ton idée, parce qu'avec ce que j'avais trouvé pendant ce temps, c'était pire qu'avec grep et répéter les lignes:
# iptables -nvL INPUT --line-numbers|awk 'BEGIN {IGNORECASE = 1} ; /br/&&/t:520/ {print $1 $4}'
6DROP
# echo $1
# echo $4
#
Hors ligne
#10 Le 31/10/2016, à 16:43
- Watael
Re : Extraire le premier et le n ième mot d'une sortie de commande ?
ouha, micP, system() pour faire un echo, bravo !
mais...
« heu - reu - se - ment, il y a » printf,
printf !
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#11 Le 31/10/2016, à 16:45
- k3c
Re : Extraire le premier et le n ième mot d'une sortie de commande ?
Merci
Je vais essayer ton idée, parce qu'avec ce que j'avais trouvé pendant ce temps, c'était pire qu'avec grep et répéter les lignes:# iptables -nvL INPUT --line-numbers|awk 'BEGIN {IGNORECASE = 1} ; /br/&&/t:520/ {print $1 $4}' 6DROP # echo $1 # echo $4 #
juste pour préciser
$1, $4, (ou $NF, le dernier mot de la ligne) dans awk, n'ont rien à voir avec $1 ou $4 sous bash
Debian 12 sur Thinkpad reconditionné
Hors ligne
#12 Le 31/10/2016, à 16:57
- Bybeu
Re : Extraire le premier et le n ième mot d'une sortie de commande ?
Ça a l'air bien mieux, on dirait que tu choppes les variables avant qu'elles ne s'évaporent:
# iptables -nvL INPUT --line-numbers| awk 'BEGIN{IGNORECASE = 1};/br/ && /t:520/ { system("echo iptable -R INPUT "$1"....-j "$4) }'
iptable -R INPUT 6....-j DROP
# echo $1
# echo "$1"
Magnifaïyque. Et pour de vrai, je vire juste le echo ? Et y'a pas moyen de mettre cette horreur de BEGIN{IGNORECASE = 1}; en début de script ? Dire qu'avec grep c'est -i , ça fait râler.
Hors ligne
#13 Le 31/10/2016, à 17:48
- MicP
Re : Extraire le premier et le n ième mot d'une sortie de commande ?
ouha, micP, system() pour faire un echo, bravo !
Je sais bien que c'est horrible,
mais mon but était de proposer une commande temporaire dont il n'y aurait qu'un mot à supprimer pour pouvoir l'exécuter après l'avoir affichée pour vérification.
D'où le
…
tu n'aura qu'à supprimer la commande echo
…
Ce qui lui permet de tester ce que va exécuter la ligne de commande et de pouvoir la reformuler si besoin.
=======
Donc, si la ligne de commande que devrait faire exécuter awk est bien :
iptable -R INPUT 6....-j DROP
il suffira de supprimer le mot echo dans la ligne de commandes awk pour que la ligne qui était affichée soit exécutée.
Mais ça m'étonnerait très fort que cette ligne de commandes puisse être exécutée formulée telle quelle car la commande iptable n'existe pas
et si on y ajoute quand même un s il faudrait aussi que les .... soient remplacés par quelque chose de cohérent pour iptables en laissant un espace de séparation avant le -j
Dernière modification par MicP (Le 31/10/2016, à 18:11)
Hors ligne
#14 Le 31/10/2016, à 18:14
- Watael
Re : Extraire le premier et le n ième mot d'une sortie de commande ?
mais mon but était de proposer une commande temporaire dont il n'y aurait qu'un mot à supprimer pour pouvoir l'exécuter après l'avoir affichée pour vérification.
ah, oui.
au temps pour moi.
mais quand même, ce serait plus clair de piper la sortie de awk vers iptables, non ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#15 Le 31/10/2016, à 18:23
- MicP
Re : Extraire le premier et le n ième mot d'une sortie de commande ?
ce serait plus clair de piper la sortie de awk vers iptables, non ?
Comme quoi, il vaut mieux quelqu'un avec de l'expérience, d'autant que je connais très mal iptables
et en plus c'est certain, vraiment beaucoup moins que toi en programmation.
…faire un script pour remplacer des lignes iptables en extrayant le n° de ligne:…
Et comme je ne sais pas ce qu'il compte faire (précisement) de la sortie de la commande…
Hors ligne
#16 Le 31/10/2016, à 19:15
- Bybeu
Re : Extraire le premier et le n ième mot d'une sortie de commande ?
Le but c'est de fignoler le firewall d'origine qui est merdeux (dd-wrt). Il est tout contrôlé par du codage en dur ou des variables en nvram positionnées par l'IU.
Bon, j'en suis là, à la première ligne de mon script initial, à essayer de remplacer 2 grep par un awk. Pas sûr que j'y gagne en place car cette première ligne ne demande qu'une variable, mais c'est pour me faire la main sur du ~simple~ (le numéro de la règle à supprimer en l’occurrence):
Cette ligne n'est pas dans mon deuxième post car déjà supprimée par mon script initial. Elle est comme ça une fois commentée la section de script concernée:
5 0 0 ACCEPT udp -- vlan2 * 0.0.0.0/0 0.0.0.0/0 udp spt:67 dpt:68
# WDV=`get_wanface` #je m'en sert plus tard pour d'autres règles
# echo $WDV
vlan2 # c'est la patte wan du routeur, et cette règle est inutile (ça marche sans elle)
# iptables -nvL INPUT --line-numbers| awk '/'$WDV'/ && /:67 d/ {printf "iptable -D INPUT "$1}'
iptable -D INPUT 5root@Routeur:~#
J'aurais pu me passer de $WDV, mais la ceinture et les bretelles pour 12 caractères, c'est pas trop cher
Ce qui s'affiche sur la dernière est correct, mais quand je réaffiche juste après toute la chaîne INPUT, le contenu de la ligne 5 est inchangé au lieu d'avoir reçu celui de la 6 (décalage vers le haut des règles du dessous).
Ça irait plus vite comme ça sans avoir besoin du numéro :
iptables -D INPUT -j ACCEPT -p udp -i vlan2 --sp 67 --dp 68
echo $?
0
certifiée radicale et sans erreur
Dernière modification par Bybeu (Le 31/10/2016, à 19:19)
Hors ligne
#17 Le 31/10/2016, à 20:20
- Bybeu
Re : Extraire le premier et le n ième mot d'une sortie de commande ?
iptables -nvL INPUT --line-numbers|awk '/'$WDV'/ && /:67 d/{system("iptables -D INPUT "$1)}'
Booo j'aime pas les espaces et ponctuations qui servent à rien, ça casse la lisibilité, je trouve, en rajoutant des trucs dont on se demande à quoi ils servent. Ou alors il faudrait en mettre 5 ou 6 pour bien séparer les éléments.
Merci beaucoup les gars. Pas besoin de printf alors ?
Hors ligne
#18 Le 01/11/2016, à 02:27
- Bybeu
Re : Extraire le premier et le n ième mot d'une sortie de commande ?
Gulp, je sèche
#!/bin/sh
#but du jeu: remplacer l'interface spécifiée comme -i br0 par tous les bridges: -i br+
iLI () {
iptables -nvL INPUT --line-numbers
}
iRI () {
iptables -R INPUT $1 $2 $3
}
iLI|awk 'BEGIN{IGNORECASE = 1};/br0/ && /t:520/{ system("echo iRI "$1" -j "$4"" " -p udp -i br+ --dp 520") }'
# ./test
iRI 7 -j DROP -p udp -i br+ --dp 520
ce qui est conforme à la syntaxe attendue (iptables -R INPUT 7 -j DROP -p udp -i br+ --dp 520)
J'ai essayé de mettre le -j dans la fonction de remplacement (iRI), ça aurait été joli, mais ça marchait pas.
Dans l'état ci-dessus, quand j'enlève le echo j'ai encore une erreur:
sh: iRI: not found
Si j'enlève les guillemets qui encadrent iRI ("iRI ") ça donne
sh: 7: not found
On peut mettre une fonction dans le truc { system() } ? Ça serait classe
Bon allez, au pieu
Dernière modification par Bybeu (Le 01/11/2016, à 09:17)
Hors ligne
#19 Le 01/11/2016, à 11:49
- Watael
Re : Extraire le premier et le n ième mot d'une sortie de commande ?
je voyais plutôt ça comme ça, quand j'ai critiqué l'emploi de system() :
iptables -nvL INPUT --line-numbers \
| awk 'BEGIN{IGNORECASE = 1};/br0/ && /t:520/{ printf("INPUT %s -j %s -p udp -i br+ --dp 520",$1,$4) }' \
| iptables -R -
pas testé.
Dernière modification par Watael (Le 01/11/2016, à 12:13)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#20 Le 01/11/2016, à 11:55
- k3c
Re : Extraire le premier et le n ième mot d'une sortie de commande ?
>>>pas testé
je te crois, j'ai des doutes sur prinf, instruction non documentée
{ prinf("INPUT
:-)
[] pas taper, je suis déjà dehors
Debian 12 sur Thinkpad reconditionné
Hors ligne
#21 Le 01/11/2016, à 11:58
- MicP
Re : Extraire le premier et le n ième mot d'une sortie de commande ?
C'est clair qu'avec quelques tubes ça va tout de suite beaucoup mieux.
[Complètement Hors sujet]
…avec le mot anglais aussi d'ailleurs mais j'ai pas osé le mettre.
[/Complètement Hors sujet]
======
…prinf…
Sans doute un bout de madeleine ou de croissant qui est resté collé sous la touche T
Utiliser plutôt printf
Dernière modification par MicP (Le 01/11/2016, à 12:01)
Hors ligne
#22 Le 01/11/2016, à 12:13
- Watael
Re : Extraire le premier et le n ième mot d'une sortie de commande ?
corrigé !
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#23 Le 01/11/2016, à 13:32
- Bybeu
Re : Extraire le premier et le n ième mot d'une sortie de commande ?
...avec quelques tubes ...[Complètement Hors sujet]
…avec le mot anglais aussi d'ailleurs mais j'ai pas osé le mettre.
[/Complètement Hors sujet]
Non, non, une seule mais bonne suffit.
Bon, en vlà du grain à mouldre, mais le temps que ça vous arrive aux neurones, j'ai trouvé qu'il y a un truc qui s'appelle export ou export -f mais j'ai pas encore creusé.
Vaut mieux quoi selon vous, que je creuse export ou que j'essaye vos tuyaux ?* Qu'est-ce que vous pressentez comme le plus économe en terme de place (sachant que j'ai grosso une dizaine de règles à modifier avec 2 jeux de 3 ou 4 fonctions (List, Del, Replace et Insert)) ?
Et vous battez pas pour moi quand-même, je vous le rendrai pas
*[EDIT] ou les deux. Et les 2 fonctions List ne seront jamais appelées depuis awk. C'est plutôt elles qui vont piper awk
Dernière modification par Bybeu (Le 01/11/2016, à 15:02)
Hors ligne
#24 Le 01/11/2016, à 13:59
- Watael
Re : Extraire le premier et le n ième mot d'une sortie de commande ?
perso, je n'arrive pas à exporter de fonction du shell courant vers le shell appelé par system().
je m'y prends peut-être mal :
$ mafonc () { echo "> $1 <"; }
$ export -f mafonc
$ awk 'BEGIN{ system("mafonc " "bla")}'
sh: 1: mafonc: not found
les solutions que j'ai aperçues sur d'autres sites me paraissent bien tortueuses par rapport à un simple pipe.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#25 Le 01/11/2016, à 15:15
- Bybeu
Re : Extraire le premier et le n ième mot d'une sortie de commande ?
perso, je n'arrive pas à exporter de fonction du shell courant vers le shell appelé par system().
je m'y prends peut-être mal :$ mafonc () { echo "> $1 <"; } $ export -f mafonc $ awk 'BEGIN{ system("mafonc " "bla")}' sh: 1: mafonc: not found
les solutions que j'ai aperçues sur d'autres sites me paraissent bien tortueuses par rapport à un simple pipe.
Heuuu... un pipe, une tuyau ?
Je crois me souvenir d'avoir lu hier soir ou tôt ce matin au détour d'un forum en briton, qu'un gars rouscaillait après une ~nouveauté~ de awk qui ferait que awk ouvre un sub-shell pour faire son boulot... sur le moment ça m'en a fait une belle, mais à y repenser, ça explique sûrement les difficultés que je rencontre (assurées par de bonnes fondation bien vaseuses en scripture bien entendu ).
La deuxième erreur dans mon post de ce matin à 2h27 me donne l'idée de recommencer avec ton export mais sans les guillemets autour de mafonc... mais plus je l'écris, plus je trouve ça bête...comme l'impression que j'ai le neurone qui se touche... allez, j'essaye quand-même, pour voir.
@+ les scripteux
Hors ligne