我希望我的用户可以运行一个脚本,但这个脚本必须以 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 组的一部分。他们只被允许执行一个脚本。仍然需要确保他们不能更改脚本。