Comment puis-je trouver uniquement les fichiers exécutables sous un certain répertoire dans Linux ?
Comment puis-je trouver uniquement les fichiers exécutables sous un certain répertoire dans Linux ?
Comment puis-je trouver uniquement les fichiers exécutables sous un certain répertoire dans Linux ?
La vérification des fichiers exécutables peut se faire avec -perm
(non recommandé) ou -executable
(recommandé, car il tient compte de l'ACL). Pour utiliser l'option -executable
:
find <dir> -executable
si vous souhaitez trouver uniquement des fichiers exécutables et non des répertoires consultables, combinez avec -type f
:
find <dir> -executable -type f
Utilisez l'option find’s -perm
. Cela permettra de trouver des fichiers dans le répertoire courant qui sont soit exécutables par leur propriétaire, par les membres du groupe ou par d'autres :
find . -perm /u=x,g=x,o=x
Edit :
Je viens de trouver une autre option qui est présente au moins dans GNU find 4.4.0 :
find . -executable
Cela devrait fonctionner encore mieux car les ACL 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 - forcé par votre employeur à utiliser un système non GNU/Linux).
Testé sur macOS 10.12.5
find . -perm +111 -type f
J'ai une autre approche, au cas où ce que vous voulez vraiment, c'est juste faire quelque chose avec des fichiers exécutables - et pas nécessairement forcer la recherche à se filtrer elle-même :
for i in `find -type f`; do [-x $i] && echo "$i is executable"; done
Je préfère cela parce que cela ne repose pas sur -executable
qui est spécifique à la plate-forme ; et cela ne repose pas sur -perm
qui est un peu obscur, un peu spécifique à la plate-forme, et comme écrit ci-dessus, cela exige que le fichier soit exécutable pour tout le monde (pas seulement pour vous).
Le -type f
est important parce que dans *nix les répertoires doivent être exécutables pour pouvoir être parcourus, et plus la requête est dans la commande find
, plus votre commande sera efficace en mémoire.
Quoi qu'il en soit, je propose juste une autre approche, puisque *nix est le pays des milliards 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 qu'adepte de la ligne unique…
find /usr/bin -executable -type f -print0 | xargs file | grep ASCII
Utilisation de “xargs” pour prendre la sortie de la commande find (en utilisant print0 pour s'assurer que les noms de fichiers avec des espaces sont traité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 “file”. Ensuite, nous utilisons le terme ASCII pour ignorer les 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 ‘NIX OS
J'ai eu besoin de ce qui précède pour trouver des fichiers avec eval dans des scripts appartenant à root, j'ai donc créé ce qui suit pour aider à trouver les faiblesses de l'escalade privée lorsque 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 &
J'ai créé une fonction dans ~/.bashrc
ce soir pour trouver les fichiers exécutables qui ne sont pas dans le chemin du système et pas dans les répertoires :
# Quickly locate executables not in the path
xlocate () {
locate -0r "$1" | xargs -0 -I{} bash -c '[[-x "$1"]] && [[! -d "$1"]] \
&& echo "executable: $1"' _ {}
} # xlocate ()
L'avantage est qu'il va chercher trois distros Linux et une installation Windows en moins d'une seconde où la commande find
prend 15 minutes.
Par exemple :
$ time xlocate llocate
executable: /bin/ntfsfallocate
executable: /home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/bin/ntfsfallocate
executable: /mnt/clone/home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/usr/bin/fallocate
executable: /mnt/e/bin/llocate
executable: /mnt/old/bin/ntfsfallocate
executable: /mnt/old/usr/bin/fallocate
executable: /usr/bin/fallocate
real 0m0.504s
user 0m0.487s
sys 0m0.018s
Ou pour un répertoire entier et tous ses sous-répertoires :
$ time xlocate /mnt/e/usr/local/bin/ | wc -l
65
real 0m0.741s
user 0m0.705s
sys 0m0.032s