什么find . exec /bin/bash -p \; -quit意思?
我已经知道,当它找到带有 a 的东西(文件?)时,.它会执行/bin/bash.
有 -p 事情做/bin/bash或find命令?
是什么\;和-quit意味着什么?
Sté*_*las 17
find . -exec /bin/bash -p \; -quit
Run Code Online (Sandbox Code Playgroud)
(这里假设 GNUfind或与其兼容-quit)将开始find,它将从.(当前工作目录)开始下降目录树,对于每个文件,从它.自己开始,执行 /bin/bash -p(那里\;只是告诉find要执行的命令在哪里结束) ),如果该命令成功,则退出(因为-quit)。
该find命令本身并没有多大用处。这是一种复杂的开始方式bash。这里-p可以给你一个关于该命令背后的(邪恶的)意图的提示。
-pbash当在权限提升上下文中调用它时(例如从执行了 setuid 可执行文件的进程调用时),它会阻止删除它的权限。
似乎我们处于一个受限的上下文中,在该上下文中,用户只能执行一组受限的命令。例如,这可以通过受限制的 shell 来完成。
但是find恰好在允许的命令列表中,并且设置受限环境的人忽略了find可以执行任意命令而不受针对外壳设置的限制(find不是外壳内置)影响的事实。
所以find . -exec /bin/bash -p \; -quit看起来有人会运行命令来规避这些限制。
该find命令实际上应该使用 option -exec,它应该以转义的分号结尾。这在 的所有手册中find都说明了需要转义才能使其成为find命令的一部分而不是 shell 命令之间的分隔符,并且(例如)不与-quit示例中显示的选项合并。
顺便说一下,-quit似乎是指一些特定的实现(例如GNU find),因为它没有出现在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。