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客户端访问。