Como posso testar a robustez de manipulação de arquivos do meu script de shell?

11

Escrevi um script de shell que lida com alguns nomes de arquivos "regulares", mas li Por que meu script de shell é bloqueado em espaços em branco ou em outros caracteres especiais? e Por que você não deve analisar a saída de ls e gostaria que fosse mais robusta e manipulasse quaisquer nomes de arquivos válidos (e / ou nomes de diretório). Como posso criar uma base de arquivos e diretórios para executar meu script?

Jeff Schaller
fonte

Respostas:

11

Crie um diretório separado para reproduzir (para facilitar a limpeza posteriormente, principalmente); isso usa o valor de $TMPDIRse estiver definido, caso contrário /tmp:

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

Crie arquivos separados, mas parecidos entre si devido ao espaço em branco (espaço, guia, nova linha, retorno de carro, backspace):

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 para o Patrick acima . Os dois códigos hexadecimais são separadores de espaço UTF-8, conhecidos como porca e carneiro ; "no contexto bidirecional, atua como espaço em branco e não é espelhado. O (s) glifo (s), em circunstâncias, podem ser confundidos com outros 20 glifos".

Crie um arquivo simples e um que se expandisse para o primeiro se fosse tratado como um globo:

touch -- x '[x]' 

Os créditos acima para Wumpus Q. Wumbley .

Na mesma linha:

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

Os créditos acima são dave_thompson_085 nos comentários aqui.

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

Crédito para o acima para godlygeek .

Um nome de arquivo que será expandido para algo diferente (e execução potencialmente arbitrária!) Se avaliado em um contexto de shell:

touch '$( echo boom )'

Usar:

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

para capturar tentativas de colocar um nome de arquivo entre aspas sem sair de aspas.

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

Os créditos acima para Stéphane Chazelas .

Crie um pipe nomeado e link simbólico (para criar arquivos que não são "regulares"):

mkfifo fifo
ln -s a alink

Crie subdiretórios com vários espaços em branco incluídos em seus nomes, juntamente com arquivos de token dentro deles:

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

Crie nomes de arquivos contendo apenas *(possivelmente problemático para remover), um nome de arquivo que consiste apenas em um espaço (regular!), Um link simbólico morto, um link simbólico que faz um loop em si mesmo e um subdiretório com um link para o diretório pai:

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

ln -s /does/not/exist dead

ln -s loop loop

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

Mais nomes de arquivos diversos. Os dois últimos são unicode para "barra fracionária" e "barra de divisão".

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

Ideias de Scott :

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

Personagens inofensivos em alguns locais, mas perigosos em outros:

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 têm a mesma classificação em alguns locais:

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

Arquivos que escapam da .[!.]* *glob (às vezes usados ​​para expandir arquivos ocultos e não ocultos):

touch ..foo ...
Jeff Schaller
fonte
a ironia de um comentário "comentário" é perturbadora; você está dizendo para adicionar explicações para o que os vários comandos estão fazendo?
Jeff Schaller
1
sim, descreva os casos de teste que você mais criou são óbvios, alguns como aquele que se parece com um caractere Unicode, não são.
muru
1
Eu adicionaria a?be a*b(citado, é claro). @muru: as sequências de bytes E2 80 82/83 são a codificação UTF-8 de U + 2002 EN SPACE e U + 2003 EM SPACE #
dave_thompson_085
Alguns gênios do mal trabalhando lá: -c
user207673
Pode ser interessante brincar -e --, embora, dependendo dos requisitos do script, talvez seja impossível acessá-los sem orientação ./. E eu estou surpreso que há tão poucos com os não-glob caracteres shell especiais, como ;, &, |, <, >, $, (, ), {, }, =, \, !, e #- por exemplo, {a,b}.
26517 Scott Scott