sudo作为其环境的另一个用户


56

$ whoami
admin
$ sudo -S -u otheruser whoami
otheruser
$ sudo -S -u otheruser /bin/bash -l -c 'echo $HOME'
/home/admin

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

具体来说,/home/otheruser/.bashrc不是来源。另外,/home/otheruser/.profile也没有来源。-(/home/otheruser/.bash_profile不存在)

编辑:确切的问题实际上是https://stackoverflow.com/questions/27738224/mkvirtualenv-with-fabric-as-another-user-fails


该问题的解决方案也将解决另一个问题,在这种情况下,您可能要删除另一个问题。
PavelŠimerda15年

Answers:


83

sudo只需使用即可调用登录shell -i。如果未指定命令,则将显示登录shell提示,否则,将获得命令的输出。

示例(登录shell):

sudo -i

示例(具有指定用户):

sudo -i -u user

示例(带有命令):

sudo -i -u user whoami

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

sudo -i -u user echo \$HOME

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

我刚刚检查了最后一个带有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
...

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

ssh user@localhost echo \$HOME

注意:SSH不需要任何特殊选项,因为SSH服务器始终创建一个登录外壳程序,以供SSH客户端访问。


2
sudo -i -u user echo \$HOME对我不起作用。输出:$HOME。strace提供与您相同的输出。怎么了
John_West

不知道,它仍然对我有用,我需要查看它甚至触摸系统。
PavelŠimerda'16

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作为管理员组$HOME,然后EXEC-ED bashsudo通过设计不改变环境,除非要求或配置的话,那么bash作为otheruser继承了它在你的shell。

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

sudo -S -u otheruser -i /bin/bash -l -c 'echo $HOME'

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


4
bHOME不会设置$ HOME-谢谢,我不知道。
user80551

在我的答案中寻找痕迹。它表明您/bin/bash -l -c 'echo $HOME'在使用时不需要自己构建命令行-i
PavelŠimerda'15

1
sudo语法在我的机器上引发了错误。(su使用该-c选项,但我认为sudo不会。)我最好运气:HomeDir=$( sudo -u "$1" -H -s echo "\$HOME" )
palswim

是的,@ palswim是正确的。不确定-S(我不需要它,所以我把它省略了),但是-c在这里不起作用,您需要-s
polynomial_donut
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.