Comandos UNIX - localizar

9

Estou tentando aprender comandos UNIX e estou jogando este jogo para aprender e estou realmente preso no momento. Estou em um servidor através do ssh e o diretório está cheio de arquivos e pastas aleatórios e a senha para o próximo nível está dentro de um dos arquivos. Foi-me dito que o arquivo tem os seguintes atributos:

  • legível por humanos
  • 1033 bytes
  • não executável

Eu estou supondo que eu deveria usar o findcomando e tentei, find ! -executablemas isso retornou uma carga de arquivos. A única ajuda legível por humanos que posso encontrar no manual ou online é imprimir os tamanhos dos arquivos em legível por humanos. Então, eu estou um pouco perdido lá?

Também tentei, find ~ -size 1033bmas isso não retornou nada. Mas quando eu tentei, find ~ -size -1033bele retornou todos os arquivos no diretório.

Nick Corin
fonte
Eu realmente gostaria de saber mais sobre este jogo!
ivanivan
2
@ivanivan bandit.overthewire.org
avgvstvs

Respostas:

16

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 a fileparte-funciona:

  • 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 alterar 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).
rozcietrzewiacz
fonte
Sei que isso é antigo, mas quero acrescentar que o uso find . -type f -size 1033ctambém retornará exatamente a mesma resposta.
Brandon Benefield
8
find . -type f -readable -size 1033c ! -executable

Observe que eu usei em cvez do btamanho do arquivo. bé para blocos de 512 bytes. cé para bytes reais.

Tim Pote
fonte
2
Eu não acho -readablemeio legível (ou seja, não binário)
hhaamu
11
@hhaamu - certo. No entanto, provavelmente não é ruim filtrar arquivos que o usuário não tem direitos para ler! Para determinar se um arquivo contém conteúdo legível por humanos, canalize os nomes retornados por findpara file.
21812 D12By
2

tudo o que escrevi foi:

find -size 1033c ! -executable

e peguei o arquivo. Aparentemente, a parte legível para humanos era jogar você fora.

PiousCape262
fonte
0
find . -readable -size 1033c \! -executable
eb0t
fonte
-readable significa que os arquivos podem ser lidos pela conta, o que não os torna necessariamente legíveis por humanos.
Anthon
0

Eu acho que para o jogo, no entanto, a sintaxe correta é:

file ./* 

Você recebe um retorno que lista em que consiste cada arquivo. Funcionou muito bem para o que você está tentando realizar no jogo Bandit. A bola curva real para esta tarefa é que cada arquivo começa com - (hífen).

ctfred0921
fonte
Você pode melhorar isso adicionando um hífen nesse comando como file ./-*este.
ConstantFun
0

Eu acho que esta é a melhor resposta real que cobriria todas as três condições

find inhere/ -type f -size 1033c ! -executable |xargs file | grep text

Mas, como muitas pessoas disseram, o executável e legível por humanos deveria nos jogar fora, então usar

find inhere/ -type f -size 1033c 

é o bastante!

bleh10
fonte