Como posso testar a robustez do manuseio de arquivos do meu shell script?

9

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

    
por Jeff Schaller 25.02.2017 / 03:03

1 resposta

10

Crie um diretório separado para jogar (para facilitar a limpeza mais tarde, principalmente); isso usa o valor de $TMPDIR se estiver definido, caso contrário, /tmp :

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

Crie arquivos separados, mas que sejam semelhantes entre si por causa do espaço em branco (espaço, tabulação, nova linha, retorno de carro, retrocesso):

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

Acredite nos comentários acima para Patrick . Os dois códigos hexadecimais são separadores de espaço UTF-8 conhecidos como porca e mutton ; "no contexto bidirecional, ele age como espaço em branco e (não) é espelhado. O (s) glyph (s) podem, sob circunstâncias, ser confundidos com outros 20 glifos."

Crie um arquivo simples e um que seja expandido para o primeiro caso seja tratado como glob:

touch -- x '[x]' 

Acredite nos comentários acima para Wumpus Q. Wumbley .

Na mesma linha:

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

Acredite nos comentários acima para dave_thompson_085 nos comentários aqui.

touch -- foo\'echo\ malicious\'bar

Acredite nos comentários acima para godlygeek .

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

touch '$( echo boom )'

Uso:

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

para capturar tentativas de colocar um nome de arquivo entre aspas sem escapar de citações.

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

Acredite nos comentários acima para Stéphane Chazelas .

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

mkfifo fifo
ln -s a alink

Crie subdiretórios com vários espaços em branco incluídos em seus nomes, junto 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 arquivo contendo apenas * (possivelmente problemático para remover), um nome de arquivo consistindo em apenas 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 de volta ao 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'

Idéias de Scott :

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

Caracteres 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 ordenam o mesmo em algumas localidades:

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

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

touch ..foo ...
    
por 19.04.2018 / 18:14