2009-09-10 11:56:56 +0000 2009-09-10 11:56:56 +0000
170
170

Hoe kan ik alleen de uitvoerbare bestanden vinden onder een bepaalde directory in Linux?

Hoe kan ik alleen de uitvoerbare bestanden vinden onder een bepaalde directory in Linux?

Antwoorden (7)

170
170
170
2009-09-10 11:59:26 +0000

Het controleren op uitvoerbare bestanden kan worden gedaan met -perm (niet aanbevolen) of -executable (aanbevolen, omdat het rekening houdt met ACL). Om de -executable optie te gebruiken:

find <dir> -executable

als u alleen uitvoerbare bestanden wilt vinden en geen doorzoekbare mappen, combineer dan met -type f:

find <dir> -executable -type f
35
35
35
2009-09-10 15:55:13 +0000

Gebruik de zoekopdracht -perm optie. Dit zal bestanden vinden in de huidige directory die ofwel uitvoerbaar zijn door hun eigenaar, door groepsleden of door anderen:

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

bewerken:

Ik heb net een andere optie gevonden die tenminste in GNU vinden 4.4.0:

find . -executable

Dit zou nog beter moeten werken omdat ook ACL’s in aanmerking worden genomen.

16
16
16
2017-06-01 06:59:33 +0000

Ik weet dat de vraag specifiek over Linux gaat, maar omdat het het eerste resultaat op Google is, wilde ik gewoon het antwoord toevoegen dat ik zocht (bijvoorbeeld als je - net als ik op dit moment - door je werkgever gedwongen wordt om een niet GNU/Linux systeem te gebruiken).

Getest op macOS 10.12.5 find . -perm +111 -type f

3
3
3
2016-04-24 02:38:26 +0000

Ik heb een andere benadering, voor het geval dat je echt iets wilt doen met uitvoerbare bestanden - en niet noodzakelijkerwijs te dwingen vinden om zichzelf te filteren:

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

Ik geef de voorkeur aan dit omdat het niet afhankelijk is van -executable dat is platform-specifiek; en het is niet afhankelijk van -perm dat is een beetje geheimzinnig, een beetje platform-specifiek, en zoals hierboven geschreven vereist het bestand om uitvoerbaar te zijn voor iedereen (niet alleen jij).

De -type f is belangrijk omdat in *nix directories uitvoerbaar moet zijn om door te kunnen gaan, en hoe meer van de query in het find commando zit, hoe efficiënter je commando in het geheugen zal zijn.

Hoe dan ook, gewoon een andere aanpak aanbieden, omdat *nix het land van een miljard aanpakken is.

2
2
2
2014-03-26 07:52:24 +0000

Een bestand gemarkeerd als uitvoerbaar hoeft geen uitvoerbaar of laadbaar bestand of object te zijn.

Hier is wat ik gebruik:

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
1
1
1
2017-07-09 12:31:14 +0000

Als ventilator van de one liner… find /usr/bin -executable -type f -print0 | xargs file | grep ASCII

Met behulp van ‘xargs’ wordt de uitvoer van het zoekcommando overgenomen (met behulp van print0 om ervoor te zorgen dat bestandsnamen met spaties correct worden behandeld). We hebben nu een lijst met bestanden die uitvoerbaar zijn en we geven ze één voor één aan als parameter voor de ‘file’ opdracht. Dan grep voor de term ASCII om binaire bestanden te negeren. Vervang -uitvoerbaar in vindopdracht met welke stijl u de voorkeur geeft (zie eerdere antwoorden) of wat werkt op uw ‘NIX OS

Ik had het bovenstaande nodig om bestanden met eval te vinden in scripts die eigendom zijn van root, dus creëerde het volgende om te helpen bij het vinden van priv escalatie zwakheden waar root gebruiker scripts uitvoert met onveilige parameters…

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 &
0
0
0
2019-06-06 00:08:27 +0000

Ik heb vanavond een functie in ~/.bashrc gemaakt om uitvoerbare bestanden te vinden die niet in het systeempad zitten en niet in mappen:

# Quickly locate executables not in the path
xlocate () {
    locate -0r "$1" | xargs -0 -I{} bash -c '[[-x "$1"]] && [[! -d "$1"]] \
        && echo "executable: $1"' _ {}
} # xlocate ()

Het voordeel is dat het drie Linux distro’s en een Windows installatie in onder een seconde zoekt waar het find commando 15 minuten duurt.

Bijvoorbeeld:

$ 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

Of voor een hele map en al zijn subs:

$ time xlocate /mnt/e/usr/local/bin/ | wc -l
65

real 0m0.741s
user 0m0.705s
sys 0m0.032s