Encontre arquivos legíveis por humanos

8

Estou tentando encontrar uma maneira eficiente de fazer o nível 5 do desafio de bandidos do OverTheWire .

De qualquer forma, tenho um monte de arquivos e há apenas um que respeita os seguintes critérios:

  • legível por humanos
  • 1033 bytes de tamanho
  • Não executável

Neste momento, estou usando o comando find e posso encontrar os arquivos correspondentes aos dois últimos critérios:

find . -size 1033c ! -executable

No entanto, não sei como excluir arquivos não legíveis para humanos. As soluções que encontrei para esse desafio usam o parâmetro -readable test, mas não acho que isso funcione. -readable só olha para as permissões dos arquivos, e não para o seu conteúdo, enquanto a descrição do desafio pede por um arquivo ASCII ou algo assim.

    
por J.Doe 30.09.2016 / 15:44

10 respostas

9

Sim, você pode usar find para procurar arquivos não executáveis do tamanho correto e, em seguida, usar file para verificar o ASCII. Algo como:

find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII

A questão, no entanto, não é tão simples quanto parece. "Human legible" é um termo horrivelmente vago. Presumivelmente, você quer dizer texto. OK, mas que tipo de texto? Caráter latino ASCII somente? Unicode completo? Por exemplo, considere estes três arquivos:

$ cat file1
abcde
$ cat file2
αβγδε
$ cat file3
abcde
αβγδε
$ cat file4
#!/bin/sh
echo foo

Tudo isso é texto e legível para humanos. Agora, vamos ver o que o file faz deles:

$ file *
file1: ASCII text
file2: UTF-8 Unicode text
file3: UTF-8 Unicode text
file4: POSIX shell script, ASCII text executable

Portanto, o comando find acima encontrará apenas file1 (para o exemplo, vamos imaginar que esses arquivos tenham 1033 caracteres). Você poderia expandir o find para procurar a string text :

find . -type f -size 1033c ! -executable -exec file {} + | grep -w text

Com o -w , grep somente imprimirá linhas em que text seja encontrado como uma palavra independente. Isso deve ser bem próximo do que você quer, mas não posso garantir que não haja nenhum outro tipo de arquivo cuja descrição possa incluir também a string text .

    
por 30.09.2016 / 16:36
2

Embora -exec seja usado principalmente para fazer algo com os arquivos encontrados, ele também pode funcionar como um teste. Portanto, podemos adicioná-lo a seus outros critérios:

find . \
  -size 1033c \
  -not -executable \
  -exec sh -c 'file {} | grep "text$"' \;

Lembre-se, grep retorna diferente de zero quando o padrão não foi encontrado e sh -c "COMMAND" retornará o resultado da avaliação (desde que seja válido). Portanto, isso só imprimirá arquivos em que file <filename> cospe algo que termine com text , por exemplo, "Texto Unicode UTF-8" ou "Texto ASCII", mas não "Texto ASCII estendido não ISO, com sequências de escape".

Em uma única linha, ela acaba sendo mais curta do que ultrapassar xargs :

find . -size 1033c -not -executable -exec sh -c 'file {} | grep "text$"' \;

Lembre-se de que você pode substituir sh -c 'file {} | grep "text$"' por qualquer comando personalizado. Se você quiser verificar algo muito complexo, pode ser uma boa ideia fornecer um script de shell e usá-lo:

find . -size 1033c -not -executable -exec is_human_readable.sh {} \;

que, a longo prazo, é mais fácil de manter do que a história do seu shell:

#!/bin/sh
file "$@" | grep "text$" > /dev/null
    
por 30.09.2016 / 16:36
1
find . -size 1033c ! -executable -exec file {} +
    
por 16.08.2018 / 12:22
0
find . -size 1033c ! -executable|xargs file|grep "ASCII text" |awk -F: '{print $1}'

Por favor, tente estes comandos combinados. funciona na minha estação.

    
por 30.09.2016 / 16:11
0

Você pode tentar isso

find . -size 1033c ! -executable -exec file {} +

Seu desafio não permite grep . arquivo de senha será relatado como "texto ASCII, com linhas muito longas"

    
por 30.09.2016 / 15:57
0

Para filtrar os nomes de arquivos legíveis por humanos, você pode usar o nome% strong ( imprimível ) classe de caracteres . Você encontrará mais sobre essas classes no manual de [:print:] .

find . -type f -size 1033c -name "[[:print:]]*" ! -executable

Pensando duas vezes, o requisito "legível por humanos" pode se referir ao conteúdo do arquivo, em vez de seu nome. Em outras palavras, você estaria procurando por arquivos texto . Isso é um pouco mais complicado. Como o @D_Bye sugeriu em um comentário, você deve usar o comando grep para determinar o tipo de conteúdo do arquivo. Mas não seria uma boa ideia executar file após um pipe, porque isso complicaria a tarefa de exibir o nome do arquivo. Aqui está o que eu sugiro:

find . -type f -size 1033c ! -executable -exec sh -c 'file -b $0 | grep -q text' {} \; -print

Isto é brevemente como o file -part funciona:

  • O predicado file executa -exec para cada sh -c 'file -b $0 | grep -q text' FILENAME que satisfaz todas as condições anteriores (tipo, tamanho, não executável).
  • Para cada um desses arquivos, um shell ( FILENAME ) executa este script : sh , substituindo file -b $0 | grep -q text pelo nome do arquivo.
  • O programa $0 determina o tipo de conteúdo de cada arquivo e gera essas informações. A opção file impede a impressão do nome de cada arquivo testado.
  • -b filtra a saída proveniente do programa grep , procurando por linhas contendo "texto" . (Veja por si mesmo como é a saída típica do comando file .)
  • Mas file não produz o texto filtrado, porque tem a opção grep (silenciosa) fornecida. O que acontece, é apenas alterar o status de saída para -q (que representa "true" - o texto filtrado foi encontrado) ou 1 (significado "error" - o texto "text " não apareceu na saída de 0 ).
  • O status de saída verdadeiro / falso proveniente de file é passado ainda mais por grep para sh e atua como o resultado final de todo o teste " find ".
  • Caso o teste acima retorne true , o comando -exec sh -c 'file $0 | grep -q text' {} \; é executado (isto é, o nome do arquivo testado é impresso).
por 13.03.2017 / 20:13
0

Você só precisa usar:

find inhere -size 1033c

Ele fornecerá o único arquivo que contém a senha.

    
por 26.03.2017 / 01:09
0
bandit4@bandit:~$ ls
inhere

bandit4@bandit:~$ file inhere/*


inhere/-file00: data
inhere/-file01: data
inhere/-file02: data
inhere/-file03: data
inhere/-file04: data
inhere/-file05: data
inhere/-file06: data
inhere/-file07: ASCII text
inhere/-file08: data
inhere/-file09: data

bandit4@bandit:~$ pwd 

/home/bandit4

bandit4@bandit:~$ cat /home/bandit4/inhere/-file07

koReBOKuIDDepwhWk7jZC0RTdopnAYKh
bandit4@bandit:~$ 
    
por 06.06.2017 / 00:38
0
find  -type f ! -executable -size 1033c

você receberá o arquivo do exercício

    
por 29.09.2018 / 14:42
-1
du --human-readable | find -not -executable -size 1033c

receberá seu resultado

    
por 09.12.2018 / 13:27

Tags