Encontre arquivos legíveis por humanos

14

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

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

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

No momento, estou usando o findcomando e posso encontrar os arquivos que correspondem aos 2 últimos critérios:

find . -size 1033c ! -executable

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

J.Doe
fonte
1
Como você define humano legível? Não é binário?
terdon
1
comando de arquivo é seu amigo :)
Romeo Ninov
Talvez duplicado de: stackoverflow.com/questions/14505218/…
zuazo
2
Os seres humanos são uma das espécies conhecidas mais inteligentes da Terra. Eles também são os únicos conhecidos por versar com computadores. Eles podem ler a maioria dos arquivos, desde que possam descobrir o tipo e se apossar das chaves de criptografia de uma criptografada.
Stéphane Chazelas
1
ALERTA DE SPOILER !!
Dan Bolser

Respostas:

16

Sim, você pode usar findpara procurar arquivos não executáveis ​​do tamanho certo e depois usar filepara procurar por 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. 'Legível por humanos' é um termo terrivelmente vago. Presumivelmente, você quer dizer texto. OK, mas que tipo de texto? Somente caracteres ASCII em latim? Unicode completo? Por exemplo, considere estes três arquivos:

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

Estes são todos textos e legíveis por humanos. Agora, vamos ver o que filefaz deles:

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

Portanto, o findcomando acima encontrará apenas file1(pelo bem deste exemplo, vamos imaginar que esses arquivos tenham 1033 caracteres). Você pode expandir o findpara procurar a sequência text:

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

Com o -w, grepimprimirá apenas as linhas onde textfor encontrada como uma palavra autônoma. Isso deve estar bem próximo do que você deseja, mas não posso garantir que não exista outro tipo de arquivo cuja descrição também inclua a string text.

terdon
fonte
4

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

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

Lembre-se de grepretornar um valor diferente de zero quando o padrão não foi encontrado e sh -c "COMMAND"retornará o resultado da avaliação (desde que válido). Portanto, isso imprimirá apenas arquivos onde file <filename>cospe algo que termine com text, por exemplo, "texto UTF-8 Unicode" ou "texto ASCII", mas não "texto ASCII estendido não ISO, com seqüências de escape".

Em uma única linha, ele acaba sendo mais curto do que passar por cima 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ê deseja procurar algo muito complexo, pode ser uma idéia melhor 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 o histórico do seu shell:

#!/bin/sh
file "$@" | grep "text$" > /dev/null
Zeta
fonte
Agradável! Observe, no entanto, que a correspondência text$excluirá coisas reconhecidas como scripts de shell. Qualquer coisa com um shebang é identificada como um script e é perfeitamente legível por humanos.
terdon
@terdon true, mas os scripts tendem a ser executáveis: D. Dito isto, um script adequado também deve reconhecer PDFs. Mas, por outro lado, um PDF contém uma imagem legível por humanos ? Um PNG de algum texto é legível ? Provavelmente. Eu acho que um teste completo será ... desafiador.
Zeta
2
find . -size 1033c ! -executable -exec file {} +
user305801
fonte
1

Você só precisa usar:

find inhere -size 1033c

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

BugHunterUK
fonte
por que + 1033c retorna mais arquivos? isso é como um sinal de maior ou igual?
Szeitlin 29/08/19
1

Basta executar o seguinte no conteúdo do diretório:

$ file -- *
-file00: data
-file01: data
-file02: data
-file03: data
-file04: data
-file05: data
-file06: data
-file07: ASCII text
-file08: data
-file09: data
$ cat -- \-file07
<output>
t0lkim
fonte
0
find . -size 1033c ! -executable|xargs file|grep "ASCII text" |awk -F: '{print $1}'

Por favor, tente este comando combinado. funciona na minha estação.

Fengbo Wu
fonte
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"

Emmanuel
fonte
0

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

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

Pensando bem, o requisito "legível por humanos" pode se referir ao conteúdo do arquivo, em vez de seu nome. Em outras palavras, você procuraria por arquivos de texto . Isso é um pouco mais complicado. Como o @D_Bye sugeriu em um comentário, você deve usar o filecomando para determinar o tipo de conteúdo do arquivo. Mas não seria uma boa ideia correr fileatrás de um canal, porque 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

É assim que filefunciona a parte -part:

  • O -execpredicado é executado sh -c 'file -b $0 | grep -q text' FILENAMEpara cada um FILENAMEque satisfaça todas as condições anteriores (tipo, tamanho, não executável).
  • Para cada um desses arquivos, um shell ( sh) é executado este pequeno roteiro : file -b $0 | grep -q text, substituindo $0com o nome do arquivo.
  • O fileprograma determina o tipo de conteúdo de cada arquivo e gera essas informações. A -bopção impede a impressão do nome de cada arquivo testado.
  • grepfiltra a saída proveniente do fileprograma, procurando linhas contendo "texto" . (Veja você mesmo como é uma saída típica do filecomando.)
  • Mas grepnão gera o texto filtrado, porque ele tem a -qopção (silenciosa) fornecida. O que ele faz é apenas mudar seu status de saída para 0(que representa "true" - o texto filtrado foi encontrado) ou 1 (significando "error" - o texto "text" não apareceu na saída de file).
  • O status de saída verdadeiro / falso proveniente grepé passado adiante shpara finde age como o resultado final de todo o -exec sh -c 'file $0 | grep -q text' {} \;teste.
  • Caso o teste acima retorne verdadeiro , o -printcomando é executado (ou seja, o nome do arquivo testado é impresso).
Alfran
fonte
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:~$ 
jesse_b
fonte
Simplesmente arquivo de uso inerentes / * e cat / home / bandit4 / inerentes / -file07
0
find  -type f ! -executable -size 1033c

você receberá o arquivo do exercício

coolhand
fonte
0
find . -type f -size 1033c ! -executable | xargs file | grep text

Ventilador de um forro

Cavaleiro das Trevas
fonte
-1
du --human-readable | find -not -executable -size 1033c

receberá seu resultado

Varun Rathore
fonte