sudo 作为另一个用户使用他们的环境

use*_*551 79 bash sudo environment-variables

$ whoami
admin
$ sudo -S -u otheruser whoami
otheruser
$ sudo -S -u otheruser /bin/bash -l -c 'echo $HOME'
/home/admin
Run Code Online (Sandbox Code Playgroud)

即使 bash 作为登录 shell 调用,为什么没有$HOME设置为/home/otheruser

具体来说,/home/otheruser/.bashrc不是来源。此外,/home/otheruser/.profile不是正在采购。- (/home/otheruser/.bash_profile不存在)

Pav*_*rda 119

要使用sudo仅使用调用登录外壳-i。如果未指定命令,您将获得登录 shell 提示,否则您将获得命令的输出。

示例(登录外壳):

sudo -i
Run Code Online (Sandbox Code Playgroud)

示例(使用指定用户):

sudo -i -u user
Run Code Online (Sandbox Code Playgroud)

示例(使用命令):

sudo -i -u user whoami
Run Code Online (Sandbox Code Playgroud)

示例(打印用户的$HOME):

sudo -i -u user echo \$HOME
Run Code Online (Sandbox Code Playgroud)

注意:反斜杠字符确保​​美元符号到达目标用户的 shell,并且不会在调用用户的 shell 中被解释。

我刚刚用strace检查了最后一个例子,它告诉你到底发生了什么。下面的输出显示正在使用--login指定的命令调用 shell ,就像在显式调用 bash 中一样,但此外sudo可以完成自己的工作,例如设置$HOME.

# strace -f -e process sudo -S -i -u user echo \$HOME
execve("/usr/bin/sudo", ["sudo", "-S", "-i", "-u", "user", "echo", "$HOME"], [/* 42 vars */]) = 0
...
[pid 12270] execve("/bin/bash", ["-bash", "--login", "-c", "echo \\$HOME"], [/* 16 vars */]) = 0
...
Run Code Online (Sandbox Code Playgroud)

我注意到您正在使用-S,我认为这通常不是一种好技术。如果您想以不同的用户身份运行命令而不通过键盘执行身份验证,您可能需要改用 SSH。它适用于localhost以及其他主机,并提供无需任何交互式输入即可工作的公钥身份验证。

ssh user@localhost echo \$HOME
Run Code Online (Sandbox Code Playgroud)

注意:您不需要任何特殊的 SSH 选项,因为 SSH 服务器总是会创建一个登录 shell,供 SSH 客户端访问。

  • `sudo -i -u user echo \$HOME` 对我不起作用。输出:`$HOME`。strace 提供与您相同的输出。有什么问题? (3认同)

小智 10

你给了 Bash 太多的信任。所有“登录外壳”对 Bash 的意义是启动和关闭时获取的文件。该$HOME变量不计算进去。

Bash 文档解释了更多登录 shell 的含义:https : //www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html#Bash-Startup-Files

事实上,Bash 根本不做任何设置$HOME$HOME由调用 shell 的任何设置(登录、ssh 等)设置,并且 shell 继承它。无论将您的 shell 启动为 admin set$HOME然后 exec-ed bashsudo设计上都不会改变环境,除非被要求或配置这样做,bash因为其他用户从您的 shell 继承了它。

如果您想sudo以您期望的方式处理更多环境,请查看-isudo的开关。尝试:

sudo -S -u otheruser -i /bin/bash -l -c 'echo $HOME'
Run Code Online (Sandbox Code Playgroud)

sudo 的手册页更详细地描述了它,虽然不是很好,但我认为:http : //linux.die.net/man/8/sudo

  • $HOME 不是由 bash 设置的 - 谢谢,我不知道。 (4认同)