Regex : négation chaine

Résolu/Fermé
Fred - 7 oct. 2013 à 10:57
 Fred - 14 oct. 2013 à 17:35
Bonjour,

Je souhaite faire un script bash qui accepte en paramètre des options complexe mais comme il peut être exécuté en tant que root, je voudrais contrôler ces paramètres.

Le script doit pouvoir accepter toutes les options de la commande lsof. Il ne doit pas y avoir dans les paramètres les caractères ";" ">" et "|" mais j'aimerais quand même autoriser "|grep".

Un extrait du script :

forbidden='[;>]|(\|grep)'

if [[ ${params} =~ ${forbidden} ]]; then
echo "Caract interdit"
exit 3
fi

J'arrive à interdire ; > et |grep, mais je ne sais pas comment interdire le caractère | sauf s'il est suivit de "grep".

Pouvez-vous me dire comment écrire cette expression régulière ?

2 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
7 oct. 2013 à 12:22
Salut,

A mon avis il faut que tu sépares en deux ton test. Un premier pour tester
[;>]
et un second pour le pipe (
|
). Puis si le pipe est intercepté, tu vérifies s'il est suivi ou non d'un
grep
...

$ echo "blibli | grep blabla" | egrep -o '\| *grep'
| grep

$ echo "blibli |grep blabla" | egrep -o '\| *grep'
|grep

$ echo "blibli |sed blabla" | egrep -o '\| *grep'

$
1
J'aurais préféré faire un seul test, mais si ce n'est pas possible, je partirais sur une solution de ce type.
Par contre, il faudra que je prenne en compte le fait qu'il peut y avoir plusieurs caractères | un suivit de grep et un autre avec autre chose.

Merci pour votre réponse
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
8 oct. 2013 à 12:51
hello
essayer avec grep, à vérifier
$ params='|grep'
$ [[ $(grep -P '[;>]|\|(?!grep)' <<<"$params") ]]&& echo stop ||echo ok
ok
$ params='|fgrep'
$ [[ $(grep -P '[;>]|\|(?!grep)' <<<"$params") ]] && echo stop || echo ok
stop
$ params='|'
$ [[ $(grep -P '[;>]|\|(?!grep)' <<<"$params") ]] && echo stop || echo ok
stop
$ params='a>'
$ [[ $(grep -P '[;>]|\|(?!grep)' <<<"$params") ]] && echo stop || echo ok
stop
$ params='|grap'
$ [[ $(grep -P '[;>]|\|(?!grep)' <<<"$params") ]] && echo stop || echo ok
stop
$
1
Je n'ai pas bien compris çà fonctionne mieux avec une rexexp perl en passant par grep qu'en faisant le test directement, mais cela correspond bien à mon besoin ;-)

Merci
0