背景

背景

我正在尝试将一些 bash 脚本集成到网站管理区域。

背景

我在 Ubuntu 服务器上运行 apache。授予 apache (www-data) sudo 权限远非理想,所以我不会这么做。但是,可以为非 sudo 用户指定 sudo 访问权限。

由于多种安全原因,apache 必须没有 sudo 访问权限,或者在最坏的情况下,严重限制 sudo 访问权限...因此,一个合适的解决方法是指定 www-data 可以 sudo 的特定脚本。

为了控制这一点,我已经创建并编辑etc/sudoers.tmpvisudo

var/www/html/scripts我添加了一个名为的测试脚本sudoscripts.sh

这简直就是:

#!/bin/sh
sudo whoami

因此,作为测试,我添加了以下行:

www-data ALL=(ALL) NOPASSWD: ALL

这按预期工作。但是,这允许在任何地方访问所有脚本。

问题

然后我将其替换为:

www-data ALL=(ALL) NOPASSWD: /var/www/html/scripts/sudoscript.sh

这失败并给出错误(在我的应用程序异常中):

sudo: no tty present and no askpass program specified

...即:没有 sudo 访问权限。

有人能指出我做错了什么吗?我查看了一些示例/其他堆栈溢出线程,它们要么匹配度很低,要么没有答案。

为了清晰起见进行编辑

以下是完整文件:

Defaults        env_reset
Defaults        exempt_group=sudo
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL) NOPASSWD:ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d

# Apache using /var/www/html/scripts

# (doesnt work)
www-data ALL=(ALL) NOPASSWD: /var/www/html/scripts/sudoscript.sh

# (works)
# www-data ALL=(ALL) NOPASSWD: ALL

谢谢

答案1

问题在于,您没有使用 sudo 运行在 sudoers 文件中输入的命令。

您直接从 Web 服务器运行/var/www/html/scripts/sudoscript.sh。然后脚本使用 调用 sudo whoami,但whoamisudoers 文件中不允许这样做。您需要whoami在 sudoers 中设置,而不是在脚本位置中设置。

这当然没有什么意义。

更有意义的是:

/var/www/html/scripts/sudoscript.sh

#!/bin/sh
whoami

/etc/sudoers

www-data ALL=(ALL) NOPASSWD: /var/www/html/scripts/sudoscript.sh

然后从您的网络服务器使用 sudo 运行脚本:

sudo /var/www/html/scripts/sudoscript.sh

答案2

在 visudo 中注释掉 requiretty 或者在它前面加上 ! ,例如:

默认值 !requiretty

相关内容