从非 root 用户执行 root 所需的脚本

Posted

技术标签:

【中文标题】从非 root 用户执行 root 所需的脚本【英文标题】:Executing root-required script from non-root user 【发布时间】:2016-07-29 13:48:53 【问题描述】:

我正在使用 Apache CGI mod 来允许通过 HTTP(S) 请求执行 python 脚本。问题是我要执行的脚本 backup.py 在某一时刻执行了一个子进程调用,其中 mysqldump 命令被传送到 sudo -我。问题是 CGI“用户”www-data 没有 root 访问权限,而且我当然不想在一般情况下给它,只是为了这个特定的任务。如何让 www-data 只在 sudo -i 下执行 mysqldump 命令?

【问题讨论】:

【参考方案1】:

提升特定脚本权限的一种方法是使用 sudoers 文件。

创建一个文件,其中包含您不想以 root 权限执行的脚本,比如/path/to/script.sh

然后,使用sudo visudo 编辑sudoers 文件,并添加以下行:

www-data ALL = (root) NOPASSWD: /path/to/script.sh

根据需要设置用户名和路径。

【讨论】:

这很接近,但是有细微差别!因为脚本包含子进程调用,所以它们不会继承 sudo 访问权限。这意味着我使用您的解决方案,但没有授予脚本的 root 访问权限,而是仅授予它需要的子进程的 root 访问权限。这可以防止有人稍后修改脚本文件并滥用该 root 访问权限(无论如何,它都可以通过 Web 访问)。所以:%www-data ALL = (root) NOPASSWD: /bin/bash, /usr/bin/python @EschersEnigma:但是,您可以访问 any bash 或 python 脚本,而不仅仅是您创建的那个。最好将需要 root 访问权限的命令隔离到单独的脚本,并为此授予权限。顺便说一句,我认为子进程通常应该从其父进程继承权限,不确定为什么需要专门添加它们。也许你用bash script.sh而不是path/to/script.sh来调用它? 它是由 CGI 调用的,所以我什至无法告诉你 CGI 是用 bash 还是 path 运行它。至于另一个问题,可能会有改进,但我不知道我会如何指定。

以上是关于从非 root 用户执行 root 所需的脚本的主要内容,如果未能解决你的问题,请参考以下文章

linux下权限问题,如何让无root管理员权限的用户执行需root权限执行的脚本文件

linux下权限问题,如何让无root管理员权限的用户执行需root权限执行的脚本文件

Cron,以root身份执行bash脚本,但一部分(Python脚本)以用户身份执行

linux下如何让一个普通用户开机执行自己的一个脚本,不用root权限

在 shell 脚本中更改为 root 用户

php利用root权限执行shell脚本 (转)