这是什么find . exec /bin/bash -p \; -quit
意思?
我已经知道,当它找到带有 a 的东西(文件?)时,.
它会执行/bin/bash
.
和命令有-p
关系吗?/bin/bash
find
\;
和是什么-quit
意思?
答案1
find . -exec /bin/bash -p \; -quit
(这里假设 GNUfind
或与其兼容-quit
)将启动,这将从(当前工作目录)find
开始沿着目录树下降,对于每个文件,从其自身开始,执行 (其中只是告诉要执行的命令在哪里结束) ),如果该命令成功,则退出(因为)。.
.
/bin/bash -p
\;
find
-quit
该find
命令本身并没有多大用处。这是一个复杂的开始方式bash
。这里-p
可以给你一个关于该命令背后的(邪恶)意图的提示。
-p
bash
当在权限提升上下文中调用它时(例如从执行了 setuid 可执行文件的进程调用时),将防止放弃其权限。
看起来我们处于一个受限制的上下文中,其中只允许用户执行一组受限制的命令。例如,这可以通过受限 shell 来完成。
但find
恰好是允许的命令列表之一,并且无论谁设置了受限环境,都忽略了这样一个事实:find
可以执行任意命令,而不受针对 shell(find
不是 shell 内置)设置的限制的影响。
所以find . -exec /bin/bash -p \; -quit
看起来有人会运行这个命令来规避这些限制。
答案2
该find
命令实际上应该使用该选项-exec
,这又应该以转义的分号结尾。这是在 的所有手册中find
,其中解释了需要转义以使其成为命令的一部分find
,而不是 shell 命令之间的分隔符和(例如)不与-quit
您的示例中显示的选项。
顺便一提,-quit
似乎指的是一些具体的实现(例如GNU 查找),因为它没有出现在POSIX:
-quit
立即退出(如果没有发生错误,则返回值为零)。这不同于-prune
因为-prune
仅适用于修剪目录的内容,而-quit
只是让 find 立即停止。没有子进程将继续运行。任何已构建的命令行-exec
...\+
或者-execdir
...\+
在程序退出之前调用。后-quit
执行后,将不再处理命令行中指定的文件。例如,find /tmp/foo /tmp/bar -print -quit
将仅打印/tmp/foo
.一种常见的用法是-quit
就是一旦找到我们想要的东西就停止搜索文件系统。例如,如果我们只想查找一个文件,我们可以这样做:
find / -name needle -print -quit
该-p
选项记录在bash 的手册:
如果 Bash 启动时有效用户(组)id 不等于真实用户(组)id,并且
-p
不提供选项,不读取启动文件,shell 函数不从环境继承,SHELLOPTS、BASHOPTS、CDPATH 和 GLOBIGNORE 变量(如果它们出现在环境中)将被忽略,有效用户 ID 设置为真实用户ID。如果在调用时提供 -p 选项,则启动行为是相同的,但不会重置有效用户 ID。