196 votes

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

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

2voto

GlennFerrieLive Points 4524

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 &

1voto

WinEunuuchs2Unix Points 187

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X