Commandes UNIX - rechercher


9

J'essaie d'apprendre les commandes UNIX et je joue à ce jeu pour apprendre et je suis vraiment bloqué en ce moment. Je suis sur un serveur via ssh et le répertoire est plein de fichiers et de dossiers aléatoires et le mot de passe pour le niveau suivant se trouve dans l'un des fichiers. On m'a dit que le fichier présente les avantages suivants:

  • lisible par l'homme
  • 1033 octets
  • non exécutable

Je suppose que je devrais utiliser la findcommande et j'ai essayé find ! -executablemais cela a renvoyé une charge de fichiers. La seule aide lisible par l'homme que je peux trouver dans le manuel ou en ligne est d'imprimer les tailles de fichier en lisible par l'homme. Alors je suis un peu perdu là-bas?

J'ai aussi essayé find ~ -size 1033bmais cela n'a rien donné. Mais quand j'ai essayé, find ~ -size -1033bil a renvoyé tous les fichiers du répertoire.


J'aimerais vraiment en savoir plus sur ce jeu!
ivanivan

2
@ivanivan bandit.overthewire.org
avgvstvs

Réponses:


16

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

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

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 filecommande pour déterminer le type de contenu du fichier. Mais ce ne serait pas une bonne idée de courir fileaprès un pipe, car cela compliquerait la tâche d'afficher le nom du fichier. Voici ce que je suggère:

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

Voici brièvement comment filefonctionne -part:

  • Le -execprédicat s'exécute sh -c 'file -b $0 | grep -q text' FILENAMEpour chacun FILENAMEqui remplit toutes les conditions précédentes (type, taille, non exécutable).
  • Pour chacun de ces fichiers, un shell ( sh) exécute ce court scénario : file -b $0 | grep -q text, en remplaçant $0le nom de fichier.
  • Le fileprogramme détermine le type de contenu de chaque fichier et génère ces informations. L' -boption empêche l'impression du nom de chaque fichier testé.
  • grepfiltre la sortie provenant du fileprogramme, recherchant les lignes contenant du "texte" . (Voyez par vous-même à quoi fileressemble une sortie typique de la commande.)
  • Mais grepne produit pas le texte filtré, car il a l' -qoption (silencieuse) donnée. Ce qu'il fait, c'est simplement changer son état de sortie en 0(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 de file).
  • Le statut de sortie vrai / faux provenant de grepest ensuite transmis shà findet agit comme le résultat final de l'ensemble du " -exec sh -c 'file $0 | grep -q text' {} \;" test.
  • Si le test ci-dessus est retourné vrai , la -printcommande est exécutée (c'est-à-dire que le nom du fichier testé est imprimé).

Je sais que c'est ancien mais je veux ajouter que l'utilisation find . -type f -size 1033crenverra également exactement la même réponse.
Brandon Benefield

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

Notez que j'ai utilisé cau lieu de bpour la taille du fichier. best pour des blocs de 512 octets. cest pour les octets réels.


2
Je ne pense pas que cela -readablesoit lisible par l'homme (c'est-à-dire non binaire)
hhaamu

1
@hhaamu - à droite. Cependant, il n'est probablement pas mauvais de filtrer les fichiers que l'utilisateur n'a pas le droit de lire! Afin de déterminer si un fichier contient un contenu lisible par l'homme, canalisez les noms renvoyés par findà file.
D_Bye

2

tout ce que j'ai écrit était:

find -size 1033c ! -executable

et a obtenu le fichier. Apparemment, la partie lisible par l'homme était de vous déconcerter.


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

-lisible signifie que les fichiers peuvent être lus par le compte, ce qui ne les rend pas nécessairement lisibles par l'homme.
Anthon

0

Je pense que pour le jeu, la syntaxe correcte est la suivante:

file ./* 

Vous obtenez un retour qui répertorie la composition de chaque fichier. Cela a très bien fonctionné pour ce que vous essayez d'accomplir dans le jeu Bandit. La vraie boule de courbe pour cette tâche est que chaque fichier commence par - (trait d'union).


Vous pouvez améliorer cela en ajoutant un trait d'union dans cette commande comme file ./-*ceci.
ConstantFun

0

Je pense que c'est la meilleure réponse réelle qui couvrirait les 3 conditions

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

Mais comme beaucoup de gens l'ont dit, l'exécutable et le lisible par l'homme devaient nous décourager, donc en utilisant

find inhere/ -type f -size 1033c 

c'est bien assez!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.