Comment puis-je tester la robustesse de gestion des fichiers de mon script shell?

11

J'ai écrit un script shell qui gère certains noms de fichiers "normaux", mais j'ai lu Pourquoi mon script shell s'étouffe sur les espaces ou d'autres caractères spéciaux? et Pourquoi vous ne devriez pas analyser la sortie de ls et je voudrais qu'elle soit plus robuste et gère tous les noms de fichiers valides (et / ou noms de répertoire). Comment puis-je créer un banc d'essai de fichiers et de répertoires pour exécuter mon script?

Jeff Schaller
la source

Réponses:

11

Créez un répertoire séparé pour jouer (pour faciliter le nettoyage plus tard, principalement); cela utilise la valeur de $TMPDIRsi elle est définie, sinon /tmp:

mkdir "${TMPDIR-/tmp}/testing"
cd "${TMPDIR-/tmp}/testing"

Créez des fichiers séparés mais qui se ressemblent en raison des espaces (espace, tabulation, retour à la ligne, retour chariot, retour arrière):

touch -- a b 'a ' 'b ' 'a b' 'a  b' $'a\bb'
touch -- a$'\xe2\x80\x82'b a$'\xe2\x80\x83'b a$'\t'b a$'\n'b a$'\r'b

Nous remercions Patrick pour ce qui précède . Les deux codes hexadécimaux sont des séparateurs d'espace UTF-8 appelés écrou et mouton ; "Dans un contexte bidirectionnel, il agit comme un espace blanc et n'est pas reflété. Le ou les glyphes peuvent, dans certaines circonstances, être confondus avec 20 autres glyphes."

Créez un fichier simple et un qui s'étendrait au premier s'il était traité comme un glob:

touch -- x '[x]' 

Nous remercions Wumpus Q. Wumbley pour ce qui précède .

Dans la même veine:

touch -- 'a?b' 'a*b'

Merci à dave_thompson_085 pour ce qui précède dans les commentaires ici.

touch -- foo\`echo\ malicious\`bar

Nous remercions Godlygeek pour ce qui précède .

Un nom de fichier qui se développera vers quelque chose de différent (et une exécution potentiellement arbitraire!) S'il est évalué dans un contexte shell:

touch '$( echo boom )'

Utilisation:

touch -- single\'quote double\"quote back\\slash

pour intercepter les tentatives de mettre un nom de fichier entre guillemets sans échapper les guillemets.

touch -- -a -b -c -r -R - a=x

Nous remercions Stéphane Chazelas pour ce qui précède .

Créez un canal nommé et un lien symbolique (pour créer des fichiers qui ne sont pas "normaux"):

mkfifo fifo
ln -s a alink

Créez des sous-répertoires contenant divers espaces blancs dans leurs noms, ainsi que des fichiers de jetons à l'intérieur:

mkdir subdir "subdir 1" "subdir 2" "subdir 3 " subdir$'\n'4
touch subdir/file0 "subdir 1"/file1 "subdir 2"/file2 "subdir 3 "/file3 subdir$'\n'4/file4

Créez des noms de fichiers contenant uniquement *(éventuellement problématique à supprimer), un nom de fichier composé uniquement d'un espace (normal!), D'un lien symbolique mort, d'un lien symbolique qui se boucle sur lui-même et d'un sous-répertoire avec un lien vers le répertoire parent:

touch -- '*' '**' '***' ' '

ln -s /does/not/exist dead

ln -s loop loop

mkdir subdir_with_link
(cd subdir_with_link && ln -s .. parent)

Plus de noms de fichiers divers. Les deux derniers sont unicode pour «barre oblique fractionnaire» et «barre oblique de division».

touch -- '(' '!' '!!'  $'\xe2\x81\x84' $'\xe2\x88\x95'

Idées de Scott :

touch -- '-' '--' ';' '&' '|' '<' '>' '$' ')' '{' '}' = \\ '!' '#' '{a,b}'

Caractères inoffensifs dans certains endroits mais dangereux dans d'autres:

touch $'X\xa0Y' # non-breaking space in iso8859-1 which is considered
                # "blank" and "space" in some locales

touch $'\xa3\x5c' $'\xa3\x60' # α and ε in BIG5 or BIG5-HKSCS charset, but
                              # �\ and �` in ASCII

Caractères qui trient de la même manière dans certains paramètres régionaux:

touch   # sorts the same in GNU locales, order non-deterministic.

Fichiers qui échappent au .[!.]* *globe (parfois utilisés pour développer des fichiers cachés et non cachés):

touch ..foo ...
Jeff Schaller
la source
l'ironie d'un commentaire "commentaire" est distrayante; dites-vous d'ajouter des explications sur ce que font les différentes commandes?
Jeff Schaller
1
oui, veuillez décrire les cas de test que vous créez le plus souvent, certains comme celui qui ressemble à un caractère Unicode, ne le sont pas.
muru le
1
J'ajouterais a?bet a*b(cité bien sûr). @muru: les séquences d'octets E2 80 82/83 sont le codage UTF-8 de U + 2002 EN SPACE et U + 2003 EM SPACE
dave_thompson_085
Quelques génies malfaisants y travaillent: -c
user207673
Il peut être intéressant de jouer avec -et --, bien que, selon les exigences du script, il soit peut-être impossible d'y accéder sans guide ./. Et je suis surpris qu'il y ait si peu avec la coquille non glob caractères spéciaux, comme ;, &, |, <, >, $, (, ), {, }, =, \, !et #- par exemple {a,b}.
Scott