Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 31/10/2016, à 15: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, à 15:10)

Hors ligne

#2 Le 31/10/2016, à 15: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.


Archlinux sur Xiaomi Air 13

Hors ligne

#3 Le 31/10/2016, à 15: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, à 15: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 ! wink


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#5 Le 31/10/2016, à 15: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, à 16:20)

Hors ligne

#6 Le 31/10/2016, à 16: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


Archlinux sur Xiaomi Air 13

Hors ligne

#7 Le 31/10/2016, à 16: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 hmm . 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, à 16:34)

Hors ligne

#8 Le 31/10/2016, à 17: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, à 17:39)

Hors ligne

#9 Le 31/10/2016, à 17: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, à 17: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, à 17:45

k3c

Re : Extraire le premier et le n ième mot d'une sortie de commande ?

Bybeu a écrit :

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


Archlinux sur Xiaomi Air 13

Hors ligne

#12 Le 31/10/2016, à 17: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, à 18: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, à 19:11)

Hors ligne

#14 Le 31/10/2016, à 19: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. sad
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, à 19: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, à 20: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~ wink (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 smile
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

wink certifiée radicale et sans erreur

Dernière modification par Bybeu (Le 31/10/2016, à 20:19)

Hors ligne

#17 Le 31/10/2016, à 21: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, à 03: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, à 10:17)

Hors ligne

#19 Le 01/11/2016, à 12: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é. neutral

Dernière modification par Watael (Le 01/11/2016, à 13:13)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#20 Le 01/11/2016, à 12: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


Archlinux sur Xiaomi Air 13

Hors ligne

#21 Le 01/11/2016, à 12: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, à 13:01)

Hors ligne

#22 Le 01/11/2016, à 13: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, à 14:32

Bybeu

Re : Extraire le premier et le n ième mot d'une sortie de commande ?

MicP a écrit :

...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 wink

*[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 lol

Dernière modification par Bybeu (Le 01/11/2016, à 16:02)

Hors ligne

#24 Le 01/11/2016, à 14: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, à 16:15

Bybeu

Re : Extraire le premier et le n ième mot d'une sortie de commande ?

Watael a écrit :

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 hmm ).

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