Comment trouver uniquement les fichiers exécutables sous un certain répertoire sous Linux ?
Réponses
Trop de publicités?En tant qu'adepte du "one liner"...
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 exécutables et nous les fournissons, un par un, comme paramètre pour la commande 'file'. Ensuite, grep pour 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 système d'exploitation NIX.
J'ai eu besoin de ce qui précède pour trouver les fichiers avec eval dans scripts appartenant à root, et j'ai donc créé ce qui suit pour aider à trouver les faiblesses de l'escalade privée où l'utilisateur root exécute scripts avec des paramètres non sûrs...
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 non 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, c'est qu'il recherche trois distributions Linux et une installation Windows en moins d'une seconde, alors que l'option find
La commande 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 toutes ses subdivisions :
$ time xlocate /mnt/e/usr/local/bin/ | wc -l
65
real 0m0.741s
user 0m0.705s
sys 0m0.032s
- Réponses précédentes
- Plus de réponses