Regex : négation chaine
Résolu
Fred
-
Fred -
Fred -
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 :
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 ?
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
-
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'ungrep
...
$ echo "blibli | grep blabla" | egrep -o '\| *grep'
| grep
$ echo "blibli |grep blabla" | egrep -o '\| *grep'
|grep
$ echo "blibli |sed blabla" | egrep -o '\| *grep'
$ -
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
$