Salut,
J'ai une collection de scripts en sh "pur" et j'aimerai extraire la liste de toutes les commandes externes appelées afin de "valider" l'environnement d'exécution.
Bon je peut faire un programme pour développer les variables et lister tout les premiers mots en début de ligne ou après un ";", "|", "&", entre "``" ou "$()" (à moins que ce dernier soit un bashism)... puis supprimer les mots réservés, les fonctions... Mais si il existe déjà un programme pour faire ça ou un shell avec quelques fonctions étendues pour les développeurs qui le permette ce n'est pas de refus et ça évitera les oublis.
# strace
Posté par neologix . Évalué à 2.
strace -f -e execve 2>&1 | cut -d "\"" -f2
[^] # Re: strace
Posté par neologix . Évalué à 3.
strace -f -e execve script.sh 2>&1 | cut -d "\"" -f2
[^] # Re: strace
Posté par barmic . Évalué à 6.
Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)
[^] # Re: strace
Posté par neologix . Évalué à 1.
Mais dans le cas général je ne pense pas que ce soit possible.
Une analyse statique ne permettra pas de couvrir les cas où le nom/chemin de l'exécutable appelé dépend de la valeur d'une variable.
Quelques pistes tout de même :
- apparemment il existe une option -rpm-requires dans certaines versions de bash qui liste des dépendances (mais elle n'est pas exhaustive en partie pour les raisons évoquées plus haut)
- en utilisant un compilateur pour bash il doit y avoir moyen d'arriver à quelque chose à partir du code généré
- sinon il reste l'écriture d'un parseur ad-hoc, mais ça risque de ne pas être marrant (et il ne sera pas non plus exhaustif)
En tout cas c'est un problème intéressant ;-)
[^] # Re: strace
Posté par totof2000 . Évalué à 5.
[^] # Re: strace
Posté par Tonton Benoit . Évalué à 1.
Sûr c'est complexe, je vais voir un peu tout ça et essayer de faire un truc qui dégrossisse au moins un peu le boulot.
[^] # Re: strace
Posté par skeespin (site web personnel) . Évalué à 1.
[^] # Re: strace
Posté par KiKouN . Évalué à 3.
[^] # Re: strace
Posté par Tonton Benoit . Évalué à 1.
D'un autre coté je ne vois trop comment développer ça sans exécuter le code :
IPT=`which iptables`
# C'est un problème indécidable
Posté par benoar . Évalué à 6.
[^] # Re: C'est un problème indécidable
Posté par Kerro . Évalué à 4.
$ V1=l;V2=s;eval $V1$V2 /
Résultat:
bin cdrom etc initrd lib media opt root srv tmp var boot dev home initrd.img lost+found mnt proc sbin sys usr vmlinuz
[^] # Re: C'est un problème indécidable
Posté par benja . Évalué à 4.
[^] # Re: C'est un problème indécidable
Posté par Kerro . Évalué à 3.
Je suis tellement calé en shell que je n'avais jamais fait attention à ça :-)
# chroot + exécution
Posté par gaaaaaAab . Évalué à 3.
pour avoir une chance d'être exhaustif en dynamique, comme le dit Barret Michel, ça suppose d'avoir des tests ayant la plus large couverture possible.
si je devais lister toutes les commandes externes d'un script, je monterais un environnement chrooté avec simplement un bash, et je compléterais cet environnement à mesure que je rencontrerais des "command not found".
Ensuite, dans une perspective à long terme, tous les nouveaux scripts devraient être validés dans cet environnement avant le déploiement.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.