¿Cómo puedo probar la solidez del manejo de archivos de mi script de shell?

Respuestas:

11

Cree un directorio separado para jugar (para facilitar la limpieza más tarde, principalmente); esto usa el valor de $TMPDIRsi está configurado, de lo contrario /tmp:

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

Cree archivos que están separados, pero que se parecen entre sí debido al espacio en blanco (espacio, tabulación, nueva línea, retorno de carro, retroceso):

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

Crédito por lo anterior a Patrick . Los dos códigos hexadecimales son separadores de espacio UTF-8 conocidos como tuerca y cordero ; "en contexto bidireccional, actúa como espacio en blanco y (no) se refleja. Los glifos pueden, en circunstancias, confundirse con otros 20 glifos".

Cree un archivo simple y uno que se expandiría al primero si fuera tratado como un globo:

touch -- x '[x]' 

Crédito por lo anterior a Wumpus Q. Wumbley .

En un sentido similar:

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

Crédito por lo anterior a dave_thompson_085 en los comentarios aquí.

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

Crédito por lo anterior a Godlygeek .

Un nombre de archivo que se expandirá a algo diferente (¡y una ejecución potencialmente arbitraria!) Si se evalúa en un contexto de shell:

touch '$( echo boom )'

Utilizar:

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

para detectar intentos de poner un nombre de archivo entre comillas sin escapar de las comillas.

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

Crédito por lo anterior a Stéphane Chazelas .

Cree una tubería con nombre y un enlace simbólico (para crear archivos que no sean "regulares"):

mkfifo fifo
ln -s a alink

Cree subdirectorios que tengan varios espacios en blanco incluidos en sus nombres, junto con archivos de token dentro de ellos:

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

Cree nombres de archivo que solo contengan *(posiblemente problemático de eliminar), un nombre de archivo que consta de solo un espacio (¡normal!), Un enlace simbólico muerto, un enlace simbólico que se repite sobre sí mismo y un subdirectorio con un enlace al directorio principal:

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

ln -s /does/not/exist dead

ln -s loop loop

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

Más nombres de archivos misceláneos. Los dos últimos son unicode para "barra fraccional" y "barra divisoria".

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

Ideas de Scott :

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

Personajes que son inofensivos en algunos lugares pero peligrosos en otros:

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

Caracteres que ordenan lo mismo en algunas configuraciones regionales:

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

Archivos que escapan al .[!.]* *globo (a veces se usan para expandir archivos ocultos y no ocultos)

touch ..foo ...
Jeff Schaller
fuente
la ironía de un comentario de "comentario" es una distracción; ¿Está diciendo que agregue explicaciones de lo que están haciendo los diversos comandos?
Jeff Schaller
1
sí, por favor describa los casos de prueba que está creando más que son obvios, algunos como ese que parece un personaje Unicode en él, no lo son.
muru
1
Yo agregaría a?by a*b(citado por supuesto). @muru: las secuencias de bytes E2 80 82/83 son la codificación UTF-8 de U + 2002 EN SPACE y U + 2003 EM SPACE
dave_thompson_085
Algunos genios malvados trabajan allí: -c
user207673
Puede ser interesante jugar con él -y --, aunque, dependiendo de los requisitos del script, quizás sea imposible acceder a ellos sin un líder ./. Y me sorprende que haya tan pocos con caracteres especiales de shell no glob, como ;, &, |, <, >, $, (, ), {, }, =, \, !, y #- por ejemplo, {a,b}.
Scott,