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
则相应地调整上面的行。