如何在目标用户环境下运行 sudo 且无需密码提示

如何在目标用户环境下运行 sudo 且无需密码提示
root@Test:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.5 LTS
Release:        20.04
Codename:       focal
root@Test:~#

我是用户 1,需要以用户 2 的身份运行脚本,并且不能有任何密码提示。将下面一行添加到 sudoers(当然使用 visudo)

user1 ALL=(user2) NOPASSWD: /usr/local/bin/script.sh

然后我以 user1 身份运行以下命令

sudo -u user2 /usr/local/bin/script.sh

它运行了,但是实际执行的一部分失败了,因为未设置 user2 的环境。

然后我尝试了以下方法 -

sudo -i -u user2 /usr/local/bin/script.sh

但是它要求输入密码,如果我输入密码,脚本就可以正常运行。问题是它提示输入密码,这对于自动化来说是一个问题。所以我的问题是,我如何在没有密码提示的情况下运行 sudo -i。

我的设置:

root@Test:~# egrep "^[^#]|^#include" /etc/sudoers
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
root ALL=(ALL:ALL) ALL
%admin ALL=(ALL) ALL
%sudo ALL=(ALL) NOPASSWD: ALL
user1 ALL=(user2) NOPASSWD: /usr/local/bin/script.sh
#includedir /etc/sudoers.d
root@Test:~#
root@Test:~# ls /etc/sudoers.d
README
root@Test:~#

看起来在脚本本身中设置目标用户的 ENV 变量是唯一的选项,但更新脚本是我的最后一个选项,因此寻找更好/替代的解决方案。

感谢任何帮助,谢谢!!

答案1

看看-i[强调我的]是什么意思:

-i,--login
将目标用户的密码数据库条目指定的 shell 作为登录 shell 运行。这意味着登录特定的资源文件(例如.profile.bash_profile或 ).login will将被 shell 读取。如果指定了命令,则使用选项将其作为简单命令传递给 shell -c命令和所有参数连接在一起,用空格隔开,每个字符(包括空格)都用反斜杠 ( \) 转义,字母数字、下划线、连字符和美元符号除外。如果未指定命令,则执行交互式 shell。[…]

来源

您尝试过执行以下操作:

sudo -i -u user2 /usr/local/bin/script.sh

假设目标用户的 shell 是bash,则运行的命令sudo如下:

/bin/bash -c /usr/local/bin/script.sh

NOPASSWD这是您想要在文件中允许的命令sudoers。请注意,没有-l强制登录 shell 的命令。sudo设置$0-bash前导破折号使它成为bash一个登录 shell。因此您不能将其包括-l在内sudoers

user1 ALL=(user2) NOPASSWD: /bin/bash -c /usr/local/bin/script.sh

如果目标用户的登录 shell 不是,/bin/bash则相应地调整上面的行。

相关内容