Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1799 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1410221
Profil sup​primé
Posté le 17-11-2017 à 12:14:03  answer
 

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 Profil supprimé le 17-11-2017 à 12:16:50
mood
Publicité
Posté le 17-11-2017 à 12:14:03  profilanswer
 

n°1410223
Profil sup​primé
Posté le 17-11-2017 à 12:47:25  answer
 

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

n°1410245
Profil sup​primé
Posté le 17-11-2017 à 16:03:31  answer
 

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 Profil supprimé le 17-11-2017 à 16:03:58
n°1410287
Profil sup​primé
Posté le 18-11-2017 à 18:53:38  answer
 

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

n°1410288
Profil sup​primé
Posté le 18-11-2017 à 20:16:08  answer
 

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 !

n°1413731
alokkin
tourner 7 fois la langue ...
Posté le 29-01-2018 à 08:32:46  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

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

 

Sujets relatifs
SCRIPT : Enregistrement piece jointe Thunderbird[Code et Script][bash] test et arguments
slinuxjjhjMonter un serveur Apache, Python 2.7, FTP - Quels logiciels utiliser?
script montage lecteur réseau apres commande kinit[SHELL] Récupérer lignes précédentes du résultat d'une recherche
centos7 lancer un script au démarageAide sur script Synology DS216j
CloudReady/Chromium OS : comment utiliser une imprimante HP sur USB ?[CRYPTOLOCKER] - Script pour empêcher la modif des fichiers ciblés ?
Plus de sujets relatifs à : Script Shell : eviter d'utiliser eval dans ce bout de script ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR