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


11

He escrito un script de shell que maneja algunos nombres de archivo "normales", pero he leído ¿Por qué mi script de shell se ahoga en espacios en blanco u otros caracteres especiales? y Por qué no debería analizar la salida de ls y me gustaría que fuera más robusto y maneje cualquier nombre de archivo válido (y / o nombres de directorio). ¿Cómo puedo crear un banco de pruebas de archivos y directorios para ejecutar mi script?

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 ...

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,
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.