我正在尝试将一些 bash 脚本集成到网站管理区域。
背景
我在 Ubuntu 服务器上运行 apache。授予 apache (www-data) sudo 权限远非理想,所以我不会这么做。但是,可以为非 sudo 用户指定 sudo 访问权限。
由于多种安全原因,apache 必须没有 sudo 访问权限,或者在最坏的情况下,严重限制 sudo 访问权限...因此,一个合适的解决方法是指定 www-data 可以 sudo 的特定脚本。
为了控制这一点,我已经创建并编辑etc/sudoers.tmp
了visudo
。
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
,但whoami
sudoers 文件中不允许这样做。您需要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