Question Comment puis-je trouver uniquement les fichiers exécutables sous un certain répertoire sous Linux?


Comment puis-je trouver uniquement les fichiers exécutables sous un certain répertoire sous Linux?


124
2017-09-10 11:56


origine


Voici une sorte de script BASH, c'est pas mal c'est ce que je peux dire :) stackoverflow.com/a/20209457/2067125 - AjayKumarBasuthkar
Qu'en est-il de l'utilisation de la norme file commander? - Breakthrough
Pour ceux qui veulent le faire sur un Mac (testé sur OS X 10.9.5): ls -l | egrep '^[^d]..x..x..x.*$'  Ce qui précède listera tous les exécutables (pour tous / utilisateur et groupe) dans le répertoire en cours. Remarque: Le -executable l'option ne fonctionne pas sur un Mac d'où la solution ci-dessus. - techfoobar
Aussi pertinent: Unix find: recherche des fichiers exécutables - Slothworks
@techfoobar: La question est ambiguë: signifie-t-il des fichiers contenant du code exécutable ou des fichiers avec une autorisation exécutable? Mais même si nous supposons que la permission exécutable est ce qui est demandé (comme la majorité des réponses semblent), la question ne dit pas exécutable au monde. Votre solution trouvera des fichiers (et aussi des fifos, des sockets, des liens symboliques, etc.) qui ont une permission d'exécution mondiale, mais pas 750 (-rwxr-x---), qui est toujours exécutable pour certains utilisateurs. - G-Man


Réponses:


La vérification des fichiers exécutables peut être effectuée avec -perm (non recommandé) ou -executable (recommandé, car il prend en compte ACL). Pour utiliser le -executable option:

find <dir> -executable

si vous souhaitez trouver uniquement des fichiers exécutables et non des répertoires pouvant faire l’objet d’une recherche, combinez-les avec -type f:

find <dir> -executable -type f

124
2017-09-10 11:59



un shebang ne signifie pas qu'ils sont exécutables. il nous dit seulement quel interprète utiliser. et par la définition linux "fichiers exécutables" sont des fichiers avec le bit exécutable (x) ensemble - knittl
Quelle version de find prend en charge ce type pour -type? homme trouve les listes b, c, d, p, f, l, s et D sur mon système. - innaM
Même chose ici, ma trouvaille n'a pas de -type x non plus. - davr
Si vous avez une ancienne version de find (probablement avant 4.3.8) qui manque -executable use find. -perm / u = x, g = x, o = x. - Ludwig Weinzierl
find: invalid predicate -executable' sur RHEL - SSH This


Utilisez les trouvailles -perm option. Cela trouvera les fichiers dans le répertoire en cours qui sont exécutables par leur propriétaire, par les membres du groupe ou par d'autres:

find . -perm /u=x,g=x,o=x

Modifier:

Je viens de trouver une autre option qui est présente au moins dans GNU find 4.4.0:

find . -executable

Cela devrait encore mieux fonctionner car les listes de contrôle d'accès sont également prises en compte.


26
2017-09-10 15:55



Cela ne fonctionne que sur une nouvelle version de find. Celui qui est fourni par défaut avec CentOS donne l'erreur find: invalid mode / u = x, g = x, o = x'` - davr
Ensuite, vous devriez essayer la version "-perm +" qui est maintenant obsolète dans GNU find: find. -perm +111 " - innaM
Semble être -perm /111 peut être la version la plus portable. - Scott


Je sais que la question mentionne spécifiquement Linux, mais puisque c'est le premier résultat sur Google, je voulais juste ajouter la réponse que je cherchais (par exemple si vous êtes - comme moi en ce moment - forcé par votre employeur à utiliser un non GNU. / Système Linux).

Testé sur macOS 10.12.5

find . -perm +111 -type f

5
2018-06-01 06:59



Fonctionne dans RHEL 5 aussi. - José Tomás Tocino


J'ai une autre approche, au cas où vous vouliez vraiment faire quelque chose avec des fichiers exécutables - et pas nécessairement forcer la recherche à filtrer:

for i in `find -type f`; do [ -x $i ] && echo "$i is executable"; done

Je préfère cela parce qu'il ne repose pas sur -executable qui est spécifique à la plate-forme; et il ne repose pas sur -perm ce qui est un peu mystérieux, une plate-forme spécifique, et comme écrit ci-dessus, le fichier doit être exécutable pour tout le monde (pas seulement vous).

le -type f est important car dans les répertoires * nix doivent être exécutables pour être traversable, et plus la requête est dans le find commande, plus votre commande sera efficace en mémoire.

Quoi qu’il en soit, ne proposer qu’une autre approche, puisque * nix est la terre d’un milliard d’approches.


3
2018-04-24 02:38



(0) Que préférez-vous, arcane et correct ou intuitif et imparfait? Je préfère correct (1)la réponse de innaM, avec find -perm, trouve les fichiers qui ont tout exécuter le bit d'autorisation défini. (2) En revanche, cette réponse ne trouve que les fichiers pour lesquels l'utilisateur actuel dispose d'une autorisation d'exécution. Certes, cela pourrait être ce que veut le PO, mais ce n’est pas clair. ... (suite) - Scott
(Suite) ... (3) Pour plus de clarté, vous voudrez peut-être changer `…` à $(…) - voir ce, ce, et ce. (4) mais ne faites pas for i in $(find …); do …; il échoue sur les noms de fichiers qui contiennent des espaces. Au lieu de cela, faites find … -exec …. (5) Et lorsque vous travaillez avec des variables shell, citez-les toujours (entre guillemets) à moins que vous ayez une bonne raison de ne pas le faire et que vous sachiez ce que vous faites. - Scott
@ scott ok, je suis corrigé :) je lis le -perm argument comme exigeant les trois, pas un d'entre eux. En outre, merci pour votre contribution à la protection des arguments du shell, c'est-à-dire tout ce dont je n'étais pas au courant. - Mark McKenna
@MarkMcKenna vous avez une faute de frappe: for i in trouver . -type f; do [ -x $i ] && echo "$i is executable"; done; vous manquez la partie <dir>, que j'utilise un point (.) - Devy


Un fichier marqué exécutable ne doit pas nécessairement être un fichier ou un objet exécutable ou chargeable.

Voici ce que j'utilise:

find ./ -type f -name "*" -not -name "*.o" -exec sh -c '
    case "$(head -n 1 "$1")" in
      ?ELF*) exit 0;;
      MZ*) exit 0;;
      #!*/ocamlrun*)exit0;;
    esac
exit 1
' sh {} \; -print

2
2018-03-26 07:52



Qu'est-ce que cela fait? - DerMike
@DerMike, c'est l'un des moyens de trouver un exécutable dans le répertoire courant, y compris les fichiers .so, même si un fichier n'est pas marqué comme exécutable, il peut être découvert. - AjayKumarBasuthkar
Eh bien, je veux dire, Comment fait-il ça? - DerMike
Il lit dans l'en-tête du fichier à découvrir, chaque fichier binaire ou fichier de script a un en-tête. - AjayKumarBasuthkar
Pour autant que je sache, -name "*" n'a aucun effet sur find - il trouve normalement tous les fichiers qui ne sont pas éliminés par les tests. - G-Man


En tant que fan du one liner ...

find /usr/bin -executable -type f -print0 | xargs file | grep ASCII

Utiliser 'xargs' pour prendre la sortie de la commande find (en utilisant print0 pour s'assurer que les noms de fichiers avec des espaces sont gérés correctement). Nous avons maintenant une liste de fichiers qui sont exécutables et nous les fournissons, un par un, comme paramètre de la commande "fichier". Ensuite, grep pour que le terme ASCII ignore les fichiers binaires. Veuillez substituer -executable dans la commande find avec le style que vous préférez (voir les réponses précédentes) ou ce qui fonctionne sur votre système d'exploitation NIX

J'avais besoin de ce qui précède pour trouver les fichiers avec eval dans les scripts appartenant à root, donc créé ce qui suit pour aider à trouver les faiblesses de l'escalade de privation où l'utilisateur root exécute des scripts avec des paramètres dangereux ...

echo -n "+ Identifying script files owned by root that execute and have an eval in them..."
find /  -not \( -path /proc -prune \)  -type f -executable -user root -exec grep -l eval {} \; -exec file {} \; | grep ASCII| cut -d ':' -f1 > $outputDir"/root_owned_scripts_with_eval.out" 2>/dev/null &

1
2017-07-09 12:31



Cela ne fonctionnera pas si le script contient des caractères non-ASCII. filerapporte le codage, donc un script python peut être signalé comme a /usr/bin/python script, UTF-8 Unicode text executable. find ... | xargs file -b | grep -v '^ELF' pourrait mieux travailler pour repérer les non-binaires. - xenoid