Ik probeer een efficiënte manier te vinden om niveau 5 van de OverTheWire bandit challenge .

Hoe dan ook, ik heb een heleboel bestanden, en er is er maar één die aan de volgende criteria voldoet:

  • Door mensen leesbaar
  • 1033 bytes groot
  • Niet-uitvoerbaar

Op dit moment gebruik ik het find commando , en ik kan de bestanden vinden die voldoen aan de 2 laatste criteria:

find . -size 1033c ! -executable 

Maar ik weet niet hoe ik niet-door mensen leesbare bestanden moet uitsluiten . Oplossingen die ik voor die uitdaging heb gevonden, gebruiken de -readable testparameter, maar ik denk niet dat dit werkt. -readable kijkt alleen naar de “permissies van de bestanden”, en niet naar de inhoud ervan, terwijl de challenge-beschrijving om een ASCII-bestand of iets dergelijks vraagt.

Opmerkingen

  • Hoe definieer je leesbaar voor mensen? Niet binair?
  • bestandsopdracht is je vriend 🙂
  • Misschien duplicaat van: stackoverflow.com/questions/14505218/…
  • Mensen zijn een van de meest intelligente bekende soorten op aarde. Ze ‘ zijn ook de enige die bekend is met computers. Ze kunnen de meeste bestanden lezen, op voorwaarde dat ze het type kunnen achterhalen en de coderingssleutels voor een gecodeerde kunnen bemachtigen.
  • SPOILER ALERT !!

Antwoord

Ja, je kunt find om te zoeken naar niet-uitvoerbare bestanden van de juiste grootte en gebruik vervolgens file om te controleren op ASCII. Iets als:

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

De questi op is echter niet zo eenvoudig als het klinkt. “Menselijk leesbaar” is een vreselijk vage term. Waarschijnlijk bedoelt u tekst. OK, maar wat voor soort tekst? Alleen ASCII-lettertekens? Volledige Unicode? Beschouw bijvoorbeeld deze drie bestanden:

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

Dit zijn allemaal tekst en leesbaar voor mensen. Laten we nu eens kijken wat file van hen maakt:

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

Dus de find commando hierboven zal alleen file1 vinden (in het belang van dit voorbeeld, stel dat die bestanden 1033 tekens hadden). U kunt de find uitvouwen om te zoeken naar de tekenreeks text:

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

Met de -w, grep zal alleen regels afdrukken waar text wordt gevonden als een op zichzelf staand woord. Dat zou aardig in de buurt moeten komen van wat je wilt, maar ik kan “niet garanderen dat er geen ander bestandstype is waarvan de beschrijving ook de string text zou kunnen bevatten.

Antwoord

Terwijl -exec meestal wordt gebruikt om iets te doen met de bestanden die indien gevonden, kan het ook als een test fungeren. Daarom kunnen we het aan uw andere criteria toevoegen:

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

Onthoud: grep retourneert niet-nul als het patroon niet “niet werd gevonden”, en sh -c "COMMAND" retourneert het resultaat van de evaluatie (zolang het geldig is). Dus dit zal print alleen bestanden waarin file <filename> iets uitspuugt dat eindigt op text, bijvoorbeeld “UTF-8 Unicode-tekst” of “ASCII-tekst”, maar niet “Non-ISO extended-ASCII text, with escape sequences”.

In een enkele regel wordt het zelfs korter dan het over xargs:

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

Houd i Houd er rekening mee dat u sh -c "file {} | grep "text$"" kunt vervangen door elk aangepast commando. Als je iets heel ingewikkelds wilt controleren, is het misschien een beter idee om een shell-script op te geven en dat in plaats daarvan te gebruiken:

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

die, in de lange run, is gemakkelijker te onderhouden dan de geschiedenis van je shell:

#!/bin/sh file "$@" | grep "text$" > /dev/null 

Reacties

  • Leuk! Houd er echter rekening mee dat het matchen van text$ dingen uitsluit die worden herkend als shellscripts. Alles met een shebang wordt geïdentificeerd als een script en die zijn perfect leesbaar voor mensen.
  • @terdon is waar, maar scripts zijn meestal uitvoerbaar: D. Dat gezegd hebbende, een goed script zou ook pdfs moeten herkennen. Maar aan de andere kant, is een pdf met een afbeelding door mensen leesbaar ? Is een png tekst leesbaar ? Waarschijnlijk. Ik denk dat een complete test … uitdagend zal zijn.

Antwoord

U hoeft alleen te gebruiken:

find inhere -size 1033c 

Het geeft u het enige bestand dat het wachtwoord bevat.

Opmerkingen

  • waarom retourneert + 1033c meer bestanden? is dat als een groter-of-is-gelijk-teken?

Antwoord

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

Antwoord

Voer gewoon het volgende uit tegen de inhoud van de directory:

$ 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> 

Antwoord

Er is slechts 1 bestand met 1033 bytes groot.

bandit5@bandit:~$ find -size 1033c ./inhere/maybehere07/.file2 bandit5@bandit:~$ 

Waarom 1033c en niet 1033? Controleer de man pagina

 -size n[cwbkMG] File uses n units of space, rounding up. The following suffixes can be used: `b" for 512-byte blocks (this is the default if no suffix is used) `c" for bytes `w" for two-byte words `k" for Kilobytes (units of 1024 bytes) `M" for Megabytes (units of 1048576 bytes) `G" for Gigabytes (units of 1073741824 bytes) 

Verifieer het met ls -l en file commando, en je krijgt alle antwoorden.

bandit5@bandit:~$ ls -l ./inhere/maybehere07/.file2 -rw-r----- 1 root bandit5 1033 May 7 20:15 ./inhere/maybehere07/.file2 bandit5@bandit:~$ bandit5@bandit:~$ file ./inhere/maybehere07/.file2 ./inhere/maybehere07/.file2: ASCII text, with very long lines bandit5@bandit:~$ 
  1. door mensen leesbaar (ASCII text)
  2. 1033 bytes groot (ook in ls -l output)
  3. niet uitvoerbaar (-rw-r-----)

Antwoord

find . -size 1033c ! -executable|xargs file|grep "ASCII text" |awk -F: "{print $1}" 

Probeer deze gecombineerde opdrachten. het werkt op mijn station.

Answer

Je kunt dit proberen

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

Uw uitdaging staat grep niet toe. wachtwoordbestand zal worden gerapporteerd als “ASCII-tekst, met erg lange regels”

Antwoord

Om de door mensen leesbare bestandsnamen, kunt u gebruik maken van de [:print:] ( afdrukbare ) tekenklasse naam. U vindt meer over dergelijke klassen in de handleiding voor grep.

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

Bij een tweede gedachte , kan de vereiste “leesbaar voor mensen” verwijzen naar de inhoud van het bestand in plaats van naar de naam. Met andere woorden, u zoekt naar tekst -bestanden. Dat is wat lastiger. Omdat @ D_Bye suggereerde in een opmerking, je zou dan het file commando moeten gebruiken om het inhoudstype van het bestand te bepalen. Maar het zou geen goed idee zijn om file na een pipe, omdat het de taak van het weergeven van de bestandsnaam zou bemoeilijken. Dit is wat ik voorstel:

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

Dit is in het kort hoe het file -deel werkt:

  • Het -exec voert het sh -c "file -b $0 | grep -q text" FILENAME voor elke FILENAME die voldoet aan alle voorgaande voorwaarden (type, grootte, niet-uitvoerbaar).
  • Voor elk van die bestanden , voert een shell (sh) dit korte script : file -b $0 | grep -q text, waarbij $0 wordt vervangen door de bestandsnaam.
  • De file programma bepaalt het inhoudstype van elk bestand en voert deze informatie uit. De -b optie voorkomt dat de naam van elk getest bestand.
  • grep filters de output afkomstig van

programma, zoekend naar regels die “tekst” bevatten. (Kijk zelf hoe een typische uitvoer van hetfilecommando eruit ziet.)

  • Maar grep voer de gefilterde tekst uit, omdat deze de -q (stille) optie heeft . Wat het doet, is gewoon de exitstatus wijzigen in 0 (wat staat voor “true” – de gefilterde tekst is gevonden) of 1 (wat betekent “fout “- de tekst ” text “ verscheen niet in de uitvoer van file).
  • De true / false exit-status afkomstig van grep wordt verder doorgegeven door sh aan find en fungeert als het uiteindelijke resultaat van het geheel “-exec sh -c "file $0 | grep -q text" {} \;” test.
  • In het geval dat de bovenstaande test true retourneerde, de -print commando wordt uitgevoerd (dwz de naam van het geteste bestand wordt afgedrukt).
  • Answer

    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:~$ 

    Reacties

    • Gebruik gewoon file inhere / * en cat / home / bandit4 / inhere / -file07

    Answer

    find -type f ! -executable -size 1033c 

    haalt je het bestand van de oefening

    Antwoord

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

    Fan van one liners

    Antwoord

    Ik denk dat de langere manier om het wachtwoord voor dit bandietenniveau te vinden die door de meesten hierboven wordt genoemd met behulp van find en grep, de meest beschrijvende opdracht is.

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

    Maar nadat ik het “file” commando meer had gebruikt, realiseerde ik me dat het vrij eenvoudig is om door mensen leesbare bestanden (ook bekend als ASCII in dit niveau) op deze manier te lokaliseren door de bestandstypen van een hele directory te controleren.De inhere directory bevat bestanden met de naam “-filexx” of controleer snel de hele inhere directory met file ./*

    Hier was mijn aanpak.

    bandit4@bandit:~/inhere$ file ./* ./-file00: data ./-file01: data ./-file02: data ./-file03: data ./-file04: data ./-file05: data ./-file06: data ./-file07: ASCII text ./-file08: data ./-file09: data bandit4@bandit:~/inhere$ cat ./-file07 koReBOKuIDDepwhWk7jZC0RTdopnAYKh 

    Geef een reactie

    Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *