#1 楼
可以使用-perm
(不推荐)或-executable
(推荐,因为它考虑了ACL)来检查可执行文件。要使用-executable
选项:find <dir> -executable
如果只想查找可执行文件而不是可搜索目录,请与
-type f
结合使用:find <dir> -executable -type f
评论
shebang并不意味着它们是可执行的。它仅告诉我们要使用哪个口译员。根据linux的定义,“可执行文件”是设置了可执行(x)位的文件
– knittl
09-09-10 12:09
find的哪个版本支持-type?男子在我的系统上找到列表b,c,d,p,f,l,s和D。
– innaM
09-09-10 15:51
如果您使用的是find的旧版本(可能在4.3.8之前),而缺少-executable用途find。 -perm / u = x,g = x,o = x。
–路德维希·魏尼尔(Ludwig Weinzierl)
2010年5月14日在19:06
-executable根本不是可移植的,应该避免
–好人
2012年10月26日15:54
在RHEL上找到:无效的谓词-executable”
–SSH此
13年5月17日在20:57
#2 楼
使用查找的-perm
选项。这将在当前目录中找到可由其所有者,组成员或其他人可执行的文件:find . -perm /u=x,g=x,o=x
编辑:
我只是找到了至少在GNU find 4.4.0中存在的另一个选项:
find . -executable
这应该会更好,因为还考虑了ACL。
评论
这仅适用于较新版本的find。 CentOS默认附带的一个错误查找:无效模式/ u = x,g = x,o = x'`
–davr
09-09-10 17:18
然后,您应该尝试使用“ -perm +”版本,该版本现已在GNU find中不推荐使用:find。 -烫发+111“
– innaM
09-09-10 19:32
好像-perm / 111可能是最可移植的版本。
–斯科特
16年4月24日在4:01
#3 楼
我知道这个问题专门针对Linux,但是由于它是Google的第一个结果,因此我只想添加我一直在寻找的答案(例如,如果您-现在像我一样-被您的雇主强迫使用非GNU / Linux系统)。在macOS 10.12.5上进行了测试
find . -perm +111 -type f
评论
也可以在RHEL 5中使用。
–JoséTomásTocino
18年5月23日在6:30
这是我可以在OS X 10.14上工作的唯一变体
–贾斯汀
19年1月16日在19:17
使用find的busybox版本时需要此功能。 -executable不起作用。 -烫发+111是完美的。
– jmcarter9t
19/12/17在17:31
#4 楼
我有另一种方法,以防万一,您真正想要的只是对可执行文件做些事情,而不必强迫自己进行过滤:for i in `find -type f`; do [ -x $i ] && echo "$i is executable"; done
我首选此方法,因为它不依赖于特定于平台的
-executable
;而且它并不依赖于-perm
,这有点奥秘,特定于平台,并且如上所述,要求文件对所有人(不仅仅是您)都是可执行的。-type f
很重要,因为* nix目录中的文件必须是可执行文件才能被遍历,并且在find
命令中查询的内容越多,该命令的内存使用效率就越高。无论如何,仅提供另一种方法,因为* nix是十亿种方法的土地。
评论
(0)您更喜欢神秘,正确或直观且有缺陷的哪个?我喜欢正确的。 (1)innaM的答案是find-perm,它查找设置了任何执行许可权的文件。 (2)相比之下,此答案仅查找当前用户具有执行权限的文件。当然,这可能是OP想要的,但尚不清楚。 …(续)
–斯科特
16年4月24日在4:36
(续)…(3)为清楚起见,您可能希望将“…”更改为$(…)–请参见此,此和此。 (4)但是不要忘记$(找到……);做…;包含空格的文件名失败。而是找到... -exec...。 (5)而且,当您使用shell变量时,请始终用双引号引起来,除非您有充分的理由不这样做,并且您确定自己知道自己在做什么。
–斯科特
16-4-24在4:36
@scott好,我的立场是正确的:)我读了-perm参数,因为它要求全部三个,而不是三个。另外,感谢您提供有关保护shell参数的输入,这些都是我所不知道的。
–马克·麦肯纳(Mark McKenna)
16-4-25的13:50
@MarkMcKenna您那里有错字:因为我在find中。型f;做[-x $ i] &&回显“ $ i是可执行的”;完成您缺少
–征款
16年8月31日在20:07
#5 楼
标有可执行文件的文件不必是可执行文件或可加载文件或对象。这里是我使用的文件:
find ./ -type f -name "*" -not -name "*.o" -exec sh -c '
case "$(head -n 1 "")" in
?ELF*) exit 0;;
MZ*) exit 0;;
#!*/ocamlrun*)exit0;;
esac
exit 1
' sh {} \; -print
评论
这是做什么的?
–DerMike
15年1月14日在8:04
@DerMike,这是在当前目录(包括.so文件)中查找可执行文件的方法之一,即使未将文件标记为可执行文件也可以发现。
– AjayKumarBasuthkar
15年1月14日在21:59
好吧,我是说,它是怎么做到的?
–DerMike
15年1月15日在10:05
它从文件的头读取以发现,每个二进制文件或脚本文件都有头。
– AjayKumarBasuthkar
15年1月15日在13:44
@nonchip我非常不同意。 @OP并没有询问将哪些文件设置为可执行文件/ + x,但是实际上询问了哪些文件。含义的定义留给读者,但是即使使用a + x,我也不会考虑portrait.png可执行文件,并且即使不小心将/ usr / bin / grep更改为错过了该可执行文件,我也将其视为可执行文件。 x标志。
–扭矩
20 Mar 20 '20在10:16
#6 楼
作为一个衬里的粉丝...find /usr/bin -executable -type f -print0 | xargs file | grep ASCII
使用'xargs'从find命令获取输出(使用print0来确保正确处理带空格的文件名)。现在,我们有了可执行文件的列表,并逐一提供它们作为“文件”命令的参数。然后使用grep表示ASCII来忽略二进制文件。请在find命令中将-executable替换为您喜欢的样式(请参见前面的答案)或在您的'NIX OS上可用的样式。
我需要以上内容才能在root拥有的脚本中查找带有eval的文件,因此已创建以下内容可帮助发现priv升级弱点,其中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 &
评论
如果脚本包含非ASCII字符,则无法使用。文件会报告编码,因此python脚本可以报告为/ usr / bin / python脚本(UTF-8 Unicode文本可执行文件)。找到... | xargs文件-b | grep -v'^ ELF'可以更好地发现非二进制文件。
–类固醇
17年7月12日在19:34
#7 楼
我今晚在~/.bashrc
中创建了一个函数,以查找不在系统路径和目录中的可执行文件: # Quickly locate executables not in the path
xlocate () {
locate -0r "" | xargs -0 -I{} bash -c '[[ -x "" ]] && [[ ! -d "" ]] \
&& echo "executable: "' _ {}
} # xlocate ()
优点是它可以在一秒钟内搜索三个Linux发行版和一个Windows安装,而
find
命令需要15分钟。例如:
$ 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
或者对于整个目录及其所有子项:
$ time xlocate /mnt/e/usr/local/bin/ | wc -l
65
real 0m0.741s
user 0m0.705s
sys 0m0.032s
评论
这是我将要使用的解决方案。非常节省时间,我喜欢能够将其放入〜/ .bashrc中。
–bballdave025
20年5月1日在21:25
评论
这是一种BASH脚本,我可以说这还不错:) stackoverflow.com/a/20209457/2067125使用标准文件命令怎么办?
对于想在Mac上执行此操作的人(在OS X 10.9.5上测试):ls -l | egrep'^ [^ d] .. x..x..x。* $'上面的内容将列出当前目录中的所有可执行文件(针对所有/用户和组)。注意:-executable选项在Mac上不起作用,因此可以使用上述解决方法。
也相关:Unix查找:搜索可执行文件
@techfoobar:问题不明确:是指包含可执行代码的文件,还是意味着具有可执行权限的文件?但是,即使我们假设需要可执行权限(就像大多数响应所希望的那样),问题也不是说世界可执行的。您的解决方案将找到具有世界执行权限但不是750(-rwxr-x ---)的文件(以及fifos,套接字,符号链接等),该文件仍对某些用户可执行。