J'essaie de trouver un moyen efficace de faire le niveau 5 du défi bandit OverTheWire .
Quoi qu'il en soit, j'ai un tas de fichiers, et il n'y en a qu'un qui respecte les critères suivants:
- Lisible par l'homme
- Taille de 1033 octets
- Non exécutable
En ce moment, j'utilise la find
commande, et je peux trouver les fichiers correspondant aux 2 derniers critères:
find . -size 1033c ! -executable
Cependant, je ne sais pas comment exclure les fichiers non lisibles par l'homme. Les solutions que j'ai trouvées pour ce défi utilisent le -readable
paramètre de test, mais je ne pense pas que cela fonctionne. -readable
ne regarde que les autorisations des fichiers, et non son contenu, tandis que la description du défi demande un fichier ASCII ou quelque chose comme ça.
Réponses:
Oui, vous pouvez utiliser
find
pour rechercher des fichiers non exécutables de la bonne taille, puis utiliserfile
pour rechercher ASCII. Quelque chose comme:La question, cependant, n'est pas aussi simple qu'il y paraît. «Lisible par l'homme» est un terme horriblement vague. Vraisemblablement, vous voulez dire du texte. OK, mais quel genre de texte? Caractère latin ASCII uniquement? Unicode complet? Par exemple, considérez ces trois fichiers:
Ce sont tous des textes et lisibles par l'homme. Voyons maintenant ce qui en
file
fait:Ainsi, la
find
commande ci-dessus ne trouvera quefile1
(pour cet exemple, imaginons que ces fichiers aient 1033 caractères). Vous pouvez développer lefind
pour rechercher la chaînetext
:Avec le
-w
,grep
imprime uniquement les lignes oùtext
se trouve en tant que mot autonome. Cela devrait être assez proche de ce que vous voulez, mais je ne peux pas garantir qu'il n'y a pas d'autre type de fichier dont la description pourrait également inclure la chaînetext
.la source
Bien qu'il
-exec
soit principalement utilisé pour faire quelque chose avec les fichiers qui ont été trouvés, il peut également servir de test. Par conséquent, nous pouvons l'ajouter à vos autres critères:Rappelez-vous,
grep
retourne non nul lorsque le modèle n'a pas été trouvé, etsh -c "COMMAND"
retournera le résultat de l'évaluation (tant qu'il est valide). Donc, cela n'imprimera que les fichiers oùfile <filename>
crache quelque chose qui se termine partext
, par exemple "Texte Unicode UTF-8" ou "Texte ASCII", mais pas "Texte ASCII étendu non ISO, avec séquences d'échappement".En une seule ligne, cela finit même plus court que de parcourir
xargs
:N'oubliez pas que vous pouvez remplacer
sh -c 'file {} | grep "text$"'
par n'importe quelle commande personnalisée. Si vous souhaitez rechercher quelque chose de très complexe, il peut être préférable de fournir un script shell et de l'utiliser à la place:qui, à long terme, est plus facile à entretenir que l'historique de votre shell:
la source
text$
exclura les éléments reconnus comme scripts shell. Tout ce qui a un shebang est identifié comme un script, et ceux-ci sont parfaitement lisibles par l'homme.la source
Il vous suffit d'utiliser:
Il vous donnera le seul fichier contenant le mot de passe.
la source
Exécutez simplement ce qui suit sur le contenu du répertoire:
la source
Veuillez essayer ces commandes combinées. cela fonctionne sur ma station.
la source
Vous pouvez essayer ceci
Votre défi ne le permet pas
grep
. le fichier de mot de passe sera signalé comme "texte ASCII, avec de très longues lignes"la source
Pour filtrer les noms de fichiers lisibles par l'homme, vous pouvez utiliser le nom de classe de caractères
[:print:]
( imprimable ) . Vous trouverez plus d'informations sur ces classes dans le manuel de .grep
Dans un second temps, l'exigence "lisible par l'homme" pourrait faire référence au contenu du fichier, au lieu de son nom. En d'autres termes, vous rechercheriez des fichiers texte . C'est un peu plus délicat. Comme @D_Bye l'a suggéré dans un commentaire, vous devez ensuite utiliser la
file
commande pour déterminer le type de contenu du fichier. Mais ce ne serait pas une bonne idée de courirfile
après un pipe, car cela compliquerait la tâche d'afficher le nom du fichier. Voici ce que je suggère:Voici brièvement comment
file
fonctionne -part:-exec
prédicat s'exécutesh -c 'file -b $0 | grep -q text' FILENAME
pour chacunFILENAME
qui remplit toutes les conditions précédentes (type, taille, non exécutable).sh
) exécute ce court script :file -b $0 | grep -q text
, en remplaçant$0
le nom de fichier.file
programme détermine le type de contenu de chaque fichier et génère ces informations. L'-b
option empêche l'impression du nom de chaque fichier testé.grep
filtre la sortie provenant dufile
programme, recherchant les lignes contenant du "texte" . (Voyez par vous-même, comment une sortie typique dufile
ressemble commande.)grep
ne produit pas le texte filtré, car il a l'-q
option (silencieuse) donnée. Ce qu'il fait, c'est simplement changer son état de sortie en0
(ce qui représente "vrai" - le texte filtré a été trouvé) ou 1 (ce qui signifie "erreur" - le texte "texte" n'apparaissait pas dans la sortie defile
).grep
est ensuite transmissh
àfind
et agit comme le résultat final de l'ensemble du "-exec sh -c 'file $0 | grep -q text' {} \;
" test.-print
commande est exécutée (c'est-à-dire que le nom du fichier testé est imprimé).la source
la source
vous obtiendrez le fichier de l'exercice
la source
Fan d'une doublure
la source
Je pense que la manière la plus longue de trouver le mot de passe pour ce niveau de bandit mentionné par la plupart ci-dessus en utilisant find et grep est la commande la plus descriptive.
find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII
Mais, après avoir utilisé la commande 'file' plus, j'ai réalisé qu'il était assez facile de localiser les fichiers lisibles par l'homme (aka ASCII à ce niveau) de cette façon en vérifiant les types de fichiers d'un répertoire entier. Le répertoire inhere contient des fichiers avec le nom '-filexx' ou vérifiez rapidement l'ensemble du répertoire inhere avec
file ./*
Voici mon approche.
la source
obtiendra votre résultat
la source