Comandi UNIX: trova


9

Sto cercando di imparare i comandi UNIX e sto giocando a questo gioco per imparare e al momento sono davvero bloccato. Sono su un server tramite SSH e la directory è piena di file e cartelle casuali e la password per il livello successivo è all'interno di uno dei file. Mi è stato detto che il file ha i seguenti attrbutes:

  • leggibile dagli umani
  • 1033 byte
  • non eseguibile

Immagino che dovrei usare il findcomando e ho provato find ! -executablema che ha restituito un carico di file. L'unico aiuto leggibile dall'uomo che posso trovare nel manuale o online è la stampa delle dimensioni dei file in leggibile dall'uomo. Quindi mi sono perso un po 'lì?

Inoltre ci ho provato find ~ -size 1033bma questo non ha restituito nulla. Ma quando l'ho provato find ~ -size -1033bha restituito tutti i file nella directory.


Mi piacerebbe davvero sapere di più su questo gioco!
Ivanivan,

2
@ivanivan bandit.overthewire.org
avgvstvs

Risposte:


16

Per filtrare i nomi dei file leggibili dall'uomo, è possibile utilizzare il nome della classe di caratteri[:print:] ( stampabile ) . Ulteriori informazioni su tali classi sono disponibili nel manuale di .grep

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

Ripensandoci, il requisito "leggibile dall'uomo" potrebbe riferirsi al contenuto del file, anziché al suo nome. In altre parole, dovresti cercare file di testo . È un po 'più complicato. Come suggerito da @D_Bye in un commento, è necessario utilizzare il filecomando per determinare il tipo di contenuto del file. Ma non sarebbe una buona idea eseguire fileuna pipe, perché complicherebbe il compito di visualizzare il nome del file. Ecco cosa suggerisco:

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

Ecco in breve come filefunziona -part:

  • Il -execpredicato viene eseguito sh -c 'file -b $0 | grep -q text' FILENAMEper ciascuno di essi FILENAMEche soddisfa tutte le condizioni precedenti (tipo, dimensione, non eseguibile).
  • Per ciascuno di questi file, un guscio ( sh) gestisce questo breve scritto : file -b $0 | grep -q text, sostituendo $0con il nome del file.
  • Il fileprogramma determina il tipo di contenuto di ciascun file e genera queste informazioni. L' -bopzione impedisce di stampare il nome di ciascun file testato.
  • grepfiltra l'output proveniente dal fileprogramma, cercando le righe che contengono "testo" . (Guarda tu stesso come fileappare un tipico output del comando.)
  • Ma grepnon genera il testo filtrato, perché ha l' -qopzione (silenziosa) fornita. Quello che fa, è semplicemente cambiare il suo stato di uscita in uno 0(che rappresenta "vero" - il testo filtrato è stato trovato) o 1 (che significa "errore" - il testo "testo" non è apparso nell'output da file).
  • Il vero / falso stato di uscita proveniente dal greppassa ulteriormente sha finde agisce come il risultato finale dell'intero " -exec sh -c 'file $0 | grep -q text' {} \;" test.
  • Nel caso in cui il test sopra riportato ritorni vero , il -printcomando viene eseguito (cioè viene stampato il nome del file testato).

So che questo è vecchio ma voglio aggiungere che l'utilizzo find . -type f -size 1033crestituirà anche la stessa risposta esatta.
Brandon Benefield,

8
find . -type f -readable -size 1033c ! -executable

Nota che ho usato cinvece che bper le dimensioni del file. bè per blocchi da 512 byte. cè per byte effettivi.


2
Non credo -readablesignifichi leggibile dall'uomo (cioè non binario)
hhaamu,

1
@hhaamu - giusto. Tuttavia, probabilmente non è male filtrare i file che l'utente non ha diritti di lettura! Al fine di determinare se un file contiene il contenuto leggibile, tubi i nomi restituiti da finda file.
D_Bye,

2

tutto quello che ho scritto è stato:

find -size 1033c ! -executable

e ho ottenuto il file. Apparentemente la parte leggibile dall'uomo era buttarti via.


0
find . -readable -size 1033c \! -executable

-leggibile significa che i file possono essere letti dall'account, il che non li rende necessariamente leggibili dall'uomo.
Anthon,

0

Penso che per il gioco la sintassi corretta sia:

file ./* 

Si ottiene un ritorno che elenca in cosa consiste ciascun file. Ha funzionato davvero bene per quello che stai cercando di realizzare nel gioco Bandit. La vera palla curva per questa attività è che ogni file inizia con - (trattino).


Puoi migliorare questo aggiungendo un trattino in quel comando in file ./-*questo modo.
ConstantFun

0

Penso che questa sia la migliore risposta effettiva che coprirebbe tutte e 3 le condizioni

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

Ma come molte persone hanno detto, l'eseguibile e leggibile dall'uomo dovevano buttarci via, così usando

find inhere/ -type f -size 1033c 

è abbastanza!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.