以删除 sudo 包的普通用户身份运行 root 脚本

以删除 sudo 包的普通用户身份运行 root 脚本

我希望我的用户可以运行一个脚本,但这个脚本必须以 root 身份执行。“问题”是 sudo 包未安装,我不想安装它。有没有办法执行此操作?

更多细节:

假设我的脚本位于 /usr/sbin/my_script/my_script.sh

所以我希望我的用户运行这样的命令:

my_script [选项]

但正如我之前所说,脚本/服务属于root,需要以root身份运行。

有什么解决办法吗?

答案1

是的,使用 setuid 位可以实现这一点。通常,程序/脚本以启动器的权限运行。Setuid 会改变这一点,程序将以文件所有者的权限运行。

过去,你可以在脚本上设置 setuid,但出于安全原因,现在不再允许这样做。一种解决方法是使用编译的包装器获取 setuid。创建文件 wrapper.c,内容如下。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
    setuid( 0 );   // you can set it at run time also
    system( "/home/your_user/your_script.bash" );
    return 0;
 }

接下来编译脚本并分配适当的权限。还要确保该脚本不属于用户所有或可由用户写入,否则他们可以为所欲为。

  (install gcc with your systems package manager)
# gcc wrapper.c -o wrapper
# chown root:root wrapper
# chmod u+s wrapper

$ ./wrapper (now runs with root permissions)

话虽如此,使用 sudo 可能要容易得多,也安全得多。Sudo 基本上是一个 setuid 包装器,但更智能、更灵活。如果您最终使用 sudo,请执行以下操作:

(add to /etc/sudoers)
your_user ALL=(ALL) NOPASSWD: /home/your_user/your_script.bash

$ sudo ./your_script.bash

这很容易设置,更安全,并且您的用户不需要成为 sudo/wheel/admin 组的一部分。他们只被允许执行一个脚本。仍然需要确保他们不能更改脚本。

相关内容