如何仅在Linux中的某个目录下找到可执行文件?

评论

这是一种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,套接字,符号链接等),该文件仍对某些用户可执行。

#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