Script Shell : eviter d'utiliser eval dans ce bout de script ?

Script Shell : eviter d'utiliser eval dans ce bout de script ? - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 17-11-2017 à 12:14:03    

Hello, Je suis en train de réécrire mon script iptables et je recontre un probleme avec ce bout de code que j'ai volontairement simplifié pour la comprehension :
C'est encore brouillon et il y à pas mal d'autres points à améliorer mais je souhaiterais déja savoir plus précisement s'il m'est possible d'éviter d'utiliser eval (ligne 30-31)  :
 

Code :
  1. FW_WOOT() {
  2.     rule FILTER INPUT -i wlan0 -p tcp --sport 43 -state "ER" -com "MON COMMENTAIRE WOOT" -j DROP
  3. }
  4. state() {
  5.     for (( i=0; i<${#1}; i++ )); do
  6.         if [ "${1:$i:1}" == "N" ]; then N=",NEW"; fi
  7.         if [ "${1:$i:1}" == "E" ]; then E=",ESTABLISHED"; fi
  8.         if [ "${1:$i:1}" == "R" ]; then R=",RELATED"; fi
  9.     done
  10.     res=$(sed -e 's/^,//' -e 's/,$//' <<<"$N$E$R" )
  11.     echo "-m state --state "$res
  12. }
  13. rule() {
  14.     local build
  15.     if [ "$1" = "FILTER" ]; then build="-t filter $IR"; shift; fi
  16.     if [ "$1" = "NAT"    ]; then build="-t nat $IR"   ; shift; fi
  17.     while test -n "$1"; do
  18.         case "$1" in
  19.         -state) build=$build" "$(state $2)                 ; shift ;;
  20.         -com)   build=$build" -m comment --comment '${2}'" ; shift ;;
  21.         *)      build=$build" "$1;;
  22.         esac;shift
  23.     done
  24.    
  25.     #FIXME
  26.     iptables $build       #Probleme
  27.     eval iptables $build  #OK
  28. }
  29. FW() {
  30.     if [ "$1" == "open" ]; then
  31.         IR="-D";"${2}"
  32.         IR="-A";"${2}"
  33.     fi
  34.     if [ "$1" == "close" ]; then
  35.         IR="-D";"${2}"
  36.     fi
  37. }
  38. FW "open" "FW_WOOT"
  39. #FW "close" FW_WOOT


 
 
 
Si je n'utilise pas eval, cela bloque avec mon commentaire contenant plusieurs mots ("MON COMMENTAIRE WOOT" ) :  
 

Code :
  1. Bad argument `COMMENTAIRE'
  2. Try `iptables -h' or 'iptables --help' for more information.


 
J'ai essayer tout un tas de syntaxes pour essayer de me passer d'eval mais je n'y arrive pas, est-ce que c'est réalisable  ?
 :jap:


Message édité par rokin-k le 17-11-2017 à 12:16:50

---------------
Diablo3
Reply

Marsh Posté le 17-11-2017 à 12:14:03   

Reply

Marsh Posté le 17-11-2017 à 12:47:25    

Edit : pour simplifier encore plus :
 

Code :
  1. OPTS="-t filter -A INPUT -i wlan0 -p tcp --sport 43 -m state --state ESTABLISHED,RELATED -m comment --comment 'MON COMMENTAIRE WOOT' -j DROP"
  2. iptables $OPTS    #ERREUR
  3. eval iptables $OPTS  #OK


---------------
Diablo3
Reply

Marsh Posté le 17-11-2017 à 16:03:31    

Je trouve tout ce code dégeux mais en solution j'ai fait ça :
 

Code :
  1. rule() {
  2.     local build com err
  3.     if [ "$1" = "FILTER" ]; then build="-t filter $IR"; shift; fi
  4.     if [ "$1" = "NAT"    ]; then build="-t nat $IR"   ; shift; fi
  5.     while test -n "$1"; do
  6.         case "$1" in
  7.         -state) build=$build" -m state --state $(state $2)" ; shift ;;
  8.         -com)   com="$2"                                    ; shift ;;
  9.         *)      build=$build" "$1 ;;
  10.         esac;shift
  11.     done
  12.     if [ -n "$com" ]; then
  13.         iptables $build -m comment --comment "$com" > $OUT 2>&1
  14.     else
  15.         iptables $build > $OUT 2>&1
  16.     fi
  17. }


Message édité par rokin-k le 17-11-2017 à 16:03:58

---------------
Diablo3
Reply

Marsh Posté le 18-11-2017 à 18:53:38    

hors propos, mais bon à savoir : les guillemets doivent englober l'assignation de variable :

Code :
  1. var="$autreVar texte $etUneAutre"


 
j'ai vu qu'il est recommander d'utiliser un tableau pour stocker des commandes complexes :

Code :
  1. build=( $build -m state $(state "$2" ) )
  2. iptables ${build[@]}

pas testé, à confirmer...

Reply

Marsh Posté le 18-11-2017 à 20:16:08    

Intéressant, tout les conseils sont bienvenu  :jap:  
Pour le 1), le fait de mettre mes $var en dehors des quotes doit venir d'une trés vieille habitude prise àpres m'etre surrement trompé pas mal de fois entre les simples et doubles quotes en php http://forum-images.hardware.fr/images/perso/cerveau%20cupra.gif
Pour le 2) je connaissais pas cette manière de faire, je vais essayer de me documenter un peu plus la dessus !


---------------
Diablo3
Reply

Marsh Posté le 29-01-2018 à 08:32:46    

En même temps ton eval sert à tester ton set de commandes ... c'est un constat. Sinon, il faut te faire une regexp de la mort pour valider ta syntaxe et voir si elle est valide, mais là, ce ne serait plus un constat, mais une validation théorique par rapport à la syntaxe de la commande iptables.


---------------
Burn the museum, wipe your ass with the Mona Lisa, this way, at least, God will know your name.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed