Comment trouver uniquement les fichiers exécutables sous un certain répertoire sous Linux?
La recherche de fichiers exécutables peut être effectuée avec -perm
(non recommandé) ou -executable
(recommandé, car il prend en compte ACL). Pour utiliser l'option -executable
:
find <dir> -executable
si vous souhaitez rechercher uniquement des fichiers exécutables et non des répertoires interrogeables, combinez-les avec -type f
:
find <dir> -executable -type f
Utilisez l'option -perm
de la recherche. Cela trouvera dans le répertoire en cours des fichiers exécutables par leur propriétaire, par les membres du groupe ou par d’autres personnes:
find . -perm /u=x,g=x,o=x
Modifier:
Je viens de trouver une autre option présente au moins dans GNU find 4.4.0:
find . -executable
Cela devrait fonctionner encore mieux, car les listes de contrôle d'accès sont également prises en compte.
Je sais que la question mentionne spécifiquement Linux, mais comme 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 - contraint par votre employeur d'utiliser un logiciel autre que GNU./Système Linux).
Testé sur macOS 10.12.5
find . -perm +111 -type f
J'ai une autre approche, au cas où vous voulez vraiment faire quelque chose avec des fichiers exécutables - et pas nécessairement forcer find à se filtrer lui-même:
for i in `find -type f`; do [ -x $i ] && echo "$i is executable"; done
Je préfère cela car il ne repose pas sur -executable
, qui est spécifique à la plate-forme; et il ne repose pas sur -perm
, qui est un peu obscur, spécifique à une plate-forme, et comme écrit ci-dessus, le fichier doit être exécutable pour tout le monde (pas seulement pour vous).
Le -type f
est important car, dans * nix, les répertoires doivent être exécutables pour pouvoir être parcourus. Plus la requête contient de la commande find
, plus votre commande sera économe en mémoire.
Quoi qu'il en soit, nous proposons simplement une autre approche, car * nix est le pays d’un milliard d’approches.
Un fichier marqué comme 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
En tant que fan du one liner ...
find /usr/bin -executable -type f -print0 | xargs file | grep ASCII
Utilisation de 'xargs' pour extraire le résultat 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 exécutables et nous les fournissons, un par un, en tant que paramètre de la commande 'file'. Puis grep pour le terme ASCII ignorer les fichiers binaires. Veuillez remplacer -executable dans la commande find par le style que vous préférez (voir les réponses précédentes) ou par ce qui fonctionne sur votre système d'exploitation NIX.
J'avais besoin de ce qui précède pour trouver des fichiers avec eval dans des scripts appartenant à root. C'est pourquoi nous avons créé ce qui suit pour aider à trouver les faiblesses de l'escalade privée dans lesquelles l'utilisateur root exécute des scripts avec des paramètres non sécurisés ...
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 &