我想知道 Ubuntu 是否有类似事件的东西。我需要运行 Jenkins 作业,但 Jenkins 没有 sudo 权限,我不想给他。但作业需要运行一些需要 sudo 权限的操作。解决方案可能是触发一个事件,该事件将以 root 用户身份监听,并且该事件将使用 sudo 权限运行代码。也许我仍然对权限感到困惑,但我认为这可能非常方便。或者像公共 root 用户界面这样的东西,它将供其他用户使用,但将以 root 用户身份运行。比如
root->doSomethingAsRoot()
希望您了解我想要实现的目标。谢谢您的帮助。
PS这个问题与这个问题
答案1
如果需要以 root 身份运行的操作可以分成单独的进程/脚本,那么您可以以 setuid root 身份运行这些进程。这是一个非常方便的工具,但在我看来,它很少使用。
什么是 setuid 进程?例如,查看该passwd
命令。它可以由任何用户运行,但需要以 root 身份运行,因为它需要修改存储在只有 root 才能访问的文件中 ( /etc/shadow
) 的密码。
如何完成?查看/usr/bin/passwd
二进制文件的权限:
-rwsr-xr-x 1 root root 68208 maj 28 2020 /usr/bin/passwd
所有者字段中的“s”而不是“x”表示该二进制文件将以其所有者的权限运行 - 即 root。
这样,每二进制可以以 root (或任何其他用户) 身份运行,无论谁调用它。
然而,脚本出于安全原因,setuid 位会被忽略。因此,要运行脚本作为 root,你需要使用二进制包装器将从内部调用脚本。您可以使用以下简单的 C 程序来创建这样的包装器:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
int rc;
setuid( 0 );
rc=WEXITSTATUS(system( "/path/to/your/script" ));
exit(rc);
}
编译该程序并使可执行文件为 setuid root (假设可执行文件名为wrapper
,dosudo chown root:root wrapper
后跟sudo chmod o+s wrapper
)。
顺便说一句。从包装器内部运行的脚本不必是 setuid;只有包装器才需要。
编辑:从评论中的解释来看,您似乎想要rm -rf /some/path
以 root 身份运行特定命令,并且担心不会意外删除其他任何内容。在这种情况下,我建议只用/path/to/your/script
这个命令替换上面包装程序中的部分rm -rf /some/path
,然后wrapper
在要运行命令的位置从脚本运行二进制文件rm -rf /some/path
。这似乎是最安全的方法。
答案2
我的直接解决方案是以 root 身份运行无休止的后台脚本,该脚本每 10 秒查找并删除所需目录。它以 nohup 身份运行,因此即使我关闭终端,它仍在运行。
while true
do
find /var/www -maxdepth 1 -type d -name 'deploy-old-*' -exec rm -rf {} \;
sleep 10
done
答案3
Laravel 使用 chmod 644 生成文件的问题的最终解决方案是通过 setfacl 为父目录设置 ACL 权限。
setfacl -R -dm "g:www-data:rw" $www_new_app_dir/storage
所有生成的文件都将从父目录继承 acl 设置。在本例中,www-data 组的 rw 为。