題 如何在Linux中的某個目錄下只找到可執行文件?


如何在Linux中的某個目錄下只找到可執行文件?


129
2017-09-10 11:56


起源


這是一種BASH腳本,它是不是我可以說:) stackoverflow.com/a/20209457/2067125 - AjayKumarBasuthkar
怎麼樣使用標準 file 命令? - Breakthrough
對於任何想要這樣做的人 蘋果電腦 (在OS X 10.9.5上測試): ls -l | egrep '^[^d]..x..x..x.*$'  以上將列出當前目錄中的所有可執行文件(對於所有/用戶和組)。 注意:The -executable 選項在Mac上不起作用因此上面的解決方法。 - techfoobar
也相關: Unix查找:搜索可執行文件 - Slothworks
@techfoobar:問題含糊不清:它是指包含可執行代碼的文件,還是指具有可執行權限的文件?但即使我們假設可執行權限是想要的(大多數響應似乎),問題也沒有說明 世界可執行。您的解決方案將找到具有世界執行權限但不是750的文件(以及fifos,套接字,符號鏈接等)(-rwxr-x---),仍然可以執行一些用戶。 - G-Man


答案:


可以使用檢查可執行文件 -perm (不推薦)或 -executable (推薦,因為它考慮了ACL)。要使用 -executable 選項:

find <dir> -executable

如果您只想查找可執行文件而不是可搜索目錄,請結合使用 -type f

find <dir> -executable -type f

133
2017-09-10 11:59



一個shebang並不意味著他們是可執行的。它告訴我們只使用哪個解釋器。並且通過linux定義“可執行文件”是具有可執行(x)位集的文件 - knittl
哪個版本的find支持-type的類型?男人在我的系統上找到列表b,c,d,p,f,l,s和D. - innaM
同樣在這裡,我的發現沒有 -type x 無論是。 - davr
如果你有一個舊版本的find(可能在4.3.8之前)缺少-executable使用find。 -perm / u = x,g = x,o = x。 - Ludwig Weinzierl
find: invalid predicate -executable' 在RHEL上 - SSH This


使用find -perm 選項。這將在當前目錄中找到可由其所有者,組成員或其他人執行的文件:

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

編輯:

我剛剛找到了另一個選項,至少在GNU find 4.4.0中存在:

find . -executable

這應該更好,因為還考慮了ACL。


29
2017-09-10 15:55



這僅適用於較新版本的find。 CentOS默認出現的那個錯誤 find: invalid mode / U = X,G = X,O = x'` - davr
然後你應該嘗試“-perm +”版本,現在在GNU find:find中已棄用。 -perm +111“ - innaM
似乎 -perm /111 可能是最便攜的版本。 - Scott


我知道這個問題特別提到了Linux,但由於它是谷歌的第一個結果,我只想添加我想要的答案(例如,如果你 - 像我一樣 - 被你的雇主強迫使用非GNU / Linux系統)。

經過測試 蘋果系統 10.12.5

find . -perm +111 -type f

8
2018-06-01 06:59



也適用於RHEL 5。 - José Tomás Tocino


我有另一種方法,如果你真正想要的只是用可執行文件做一些事情 - 而不一定強制查找過濾自己:

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

我更喜歡這個因為它不依賴 -executable 這是特定於平台的;並且它不依賴於 -perm 這有點神秘,有點特定於平台,如上所述,要求文件對每個人都可執行(不僅僅是你)。

-type f 很重要,因為* nix目錄必須是可執行的可遍歷的,並且查詢的內容越多 find 命令,命令的內存效率會越高。

無論如何,只是提供另一種方法,因為* nix是十億種方法的土地。


3
2018-04-24 02:38



(0)你更喜歡哪種,神秘而正確,直觀和有缺陷?我更喜歡正確。 (1)innaM的回答,特色 find -perm,找到有的文件 任何 執行權限位設置。 (2)相比之下,此答案僅查找當前用戶具有執行權限的文件。當然,這可能是OP想要的,但目前還不清楚。 ......(續) - Scott
(續)......(3)為清楚起見,您可能想要改變 `…` 至 $(…)  - 看 這個, 這個,和 這個。 (4)但不是 for i in $(find …); do …;它在包含空格的文件名上失敗。相反,做 find … -exec …。 (5)而且,當你使用shell變量時,總是引用它們(用雙引號),除非你有充分的理由不這樣做,並且你確定你知道你在做什麼。 - Scott
@scott好的,我站得更正:)我看了 -perm 論證要求所有三個,而不是其中之一。另外,感謝您關於保護shell參數的輸入,這是我不知道的所有內容。 - Mark McKenna
@MarkMcKenna你有一個拼寫錯誤: for i in 找 。 -type f; do [ -x $i ] && echo "$i is executable"; done;你錯過了<dir>部分,我使用了一個點(。) - Devy


標記為可執行文件的文件不必是可執行文件或可加載文件或對象。

這是我使用的:

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

2
2018-03-26 07:52



這是做什麼的? - DerMike
@DerMike,這是在當前目錄中查找可執行文件的方法之一,包括.so文件,即使文件沒有標記為可執行文件,它也可以發現。 - AjayKumarBasuthkar
嗯,我的意思是, 怎麼樣 它做到了嗎? - DerMike
它從文件的頭部讀取以發現,每個二進製文件或腳本文件都有標頭。 - AjayKumarBasuthkar
我所知道的, -name "*" 對...沒有影響 find  - 它通常會找到所有未通過測試消除的文件。 - G-Man


作為一個班輪的粉絲......

find /usr/bin -executable -type f -print0 | xargs file | grep ASCII

使用'xargs'從find命令獲取輸出(使用print0確保正確處理帶空格的文件名)。我們現在有一個可執行文件列表,我們逐個提供它們作為'file'命令的參數。然後grep用術語ASCII來忽略二進製文件。請將find命令中的-executable替換為您喜歡的樣式(請參閱前面的答案)或在您的'NIX OS上使用的樣式

我需要以上內容在root擁有的腳本中查找帶有eval的文件,因此創建了以下內容以幫助查找root用戶運行帶有不安全參數的腳本的權限升級弱點...

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 &

1
2017-07-09 12:31



如果腳本包含非ASCII字符,則無效。 file報告編碼,因此可以將python腳本報告為 a /usr/bin/python script, UTF-8 Unicode text executable。 find ... | xargs file -b | grep -v '^ELF' 可以更好地發現非二進製文件。 - xenoid