Comandos do UNIX - localizar

7

Estou tentando aprender comandos do UNIX e estou jogando este jogo para aprender e estou realmente preso no momento. Eu estou em um servidor através de 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

Acredito que devo usar o comando find e tentei find ! -executable , mas isso retornou uma carga de arquivos. A única ajuda legível para humanos que posso encontrar no manual ou online é imprimir os tamanhos dos arquivos em legível para humanos. Então estou um pouco perdido lá?

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

    
por nickcorin 16.07.2012 / 02:09

6 respostas

13

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 16.07.2012 / 13:01
6
find . -type f -readable -size 1033c ! -executable

Observe que usei c em vez de b para o tamanho do arquivo. b é para blocos de 512 bytes. c é para bytes reais.

    
por 16.07.2012 / 02:30
1

tudo que escrevi foi:

find -size 1033c ! -executable

e peguei o arquivo. Aparentemente, a parte humana legível era te jogar fora.

    
por 13.09.2016 / 11:05
0
find . -readable -size 1033c \! -executable
    
por 11.11.2014 / 07:30
0

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

file ./* 

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

    
por 02.08.2017 / 02:42
0

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 o legível humano foram para nos jogar fora, então usando

find inhere/ -type f -size 1033c 

é o bastante!

    
por 08.04.2018 / 14:03