当使用find
带有-execdir
选项的程序时,我看到人们说{}
将替换为目录,将+
替换为文件名,但手册没有说明它们的作用。有一些官方文档可以解释这一点吗?我还想知道它们是否扩展为相对路径或绝对路径。我尝试创建一个脚本,它将采用{}
和+
作为参数并将其内容保存到单独的文件中。我假设它们会作为两个单独的参数传递,这将使我能够看到每个参数是如何扩展的,但我得到的结果使它看起来只有一个参数被传递给脚本,所以我仍然不能完全向自己证明这些是什么以及它们是如何扩展的。
这是我正在运行的命令:find '/home/jesse/hacking/sh_sandbox' -type f -execdir /home/jesse/hacking/sh_sandbox/save_params.sh {} +
save_params.sh 脚本是一个可执行的 shell 脚本,其代码如下:
echo $0 >> /home/jesse/hacking/sh_sandbox/zero_param.txt
echo $1 >> /home/jesse/hacking/sh_sandbox/first_param.txt
echo $2 >> /home/jesse/hacking/sh_sandbox/second_param.txt
echo $3 >> /home/jesse/hacking/sh_sandbox/third_param.txt
Zero_param 文本文件将填充正在执行的脚本的名称,这是预期的。 first_param.txt 文件中充满了./filename
不同的文件名。 Second_param 和 Third_param 文本文件都填充有空行,每个空行的行数与其他文件相同。这让我相信没有第二个参数被传递给save_params.sh
.
答案1
+
是结束标记,{}
替换为文件名,当前目录是路径。
所以
$PWD
=/home/jesse/hacking/sh_sandbox/
$0
=/home/jesse/hacking/sh_sandbox/save_params.sh
$1
=./zero_param.txt
$2
=./first_param.txt
$3
=./second_param.txt
$4
=./third_param.txt
或类似的东西...重新阅读问题,似乎编写脚本是为了修改 find 正在搜索的目录,所以真正发生的情况可能更复杂。
第一次运行时只找到一个文件
$PWD
=/home/jesse/hacking/sh_sandbox/
$0
=/home/jesse/hacking/sh_sandbox/save_params.sh
$1
=./save_params.sh
因此,将创建包含反映这一点的内容的文件。
答案2
find ... -execdir command {} +
不做那样的事情。
它的工作原理与执行命令之前完全相同,find ... -exec
只是find
首先将目录更改为匹配文件所在的目录。
运行man find
(或者如果使用 GNU find,info find
或者pinfo find
获取更详细的文档)并搜索-execdir
.
来自 GNUfind
手册页:
-execdir command ;
-execdir command {} +
与 类似
-exec
,但指定的命令是从包含匹配文件的子目录运行的,该子目录通常不是您开始查找的目录。这是一种更安全的调用命令的方法,因为它避免了解析匹配文件的路径期间的竞争条件。与
-exec
操作一样,+
的形式-execdir
将构建一个命令行来处理多个匹配的文件,但任何给定的命令调用都只会列出同一子目录中存在的文件。如果你使用这个选项,你必须确保你的
$PATH
环境变量没有引用.
;否则,攻击者可以通过在您将运行的目录中保留适当命名的文件来运行他们喜欢的任何命令-execdir
。这同样适用于其中的条目为
$PATH
空或不是绝对目录名称。如果 find 遇到错误,有时会导致立即退出,因此某些挂起的命令可能根本无法运行。操作的结果取决于是否 正在使用该操作
+
或 变体;始终返回 true,而 仅当命令返回 0 时才返回 true。;
-execdir command {} +
-execdir command {} ;
请注意,即使手册页摘录中没有提到它,也;
必须像\;
从 shell 命令行或脚本运行一样进行转义,以便 shell 不会将其解释为命令的结尾find
,而是作为参数传递给to 表示命令的find
结束。不需要逃避。find
-exec
+