当您有某种服务器时,您可以通过例如访问它,ssh user1@ip并且您也可以ssh root@ip使用 su 权限转到您的 root 用户,然后转到su user1. 在我看来,这两种方式都应该引导我进入相同的用户环境(在这种情况下,“user1”),但在我的实际经验中并没有,因为ssh user1@ip安装了一些东西,su user1但没有安装。
这是为什么?
mur*_*uru 15
SSH 启动一个登录shell。su,默认情况下没有。
特别是,这意味着该用户的~/.profile(或类似文件)不是来源。因此,在 中所做的更改~/.profile不会生效。也可能是这样:
~/.profile,这可能会污染用户的环境。
/etc/profile并且/etc/profile.d/*可能会为不同的用户应用不同的设置(但不是默认情况下)PAM 配置不同。例如,/etc/pam.d/ssh有:
session required pam_env.so user_readenv=1 envfile=/etc/default/locale
Run Code Online (Sandbox Code Playgroud)
而/etc/pam.d/su有:
session required pam_env.so readenv=1 envfile=/etc/default/locale
Run Code Online (Sandbox Code Playgroud)
这意味着 SSH 会加载~/.pam_environment,但su不会。这是一个很大的问题,因为~/.pam_environment它是环境变量的独立于 shell 的地方,如果您从 GUI、TTY 或 SSH 登录,它就会被应用。
要启动登录 shell,请运行以下任一命令:
su - <username>
sudo -iu <username>
Run Code Online (Sandbox Code Playgroud)
例子:
# su muru -c 'sh -c "echo $HOME $PATH"'
/home/muru /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
# su - muru -c 'sh -c "echo $HOME $PATH"'
/home/muru /home/muru/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
# sudo -iu muru sh -c 'echo $HOME $PATH'
/home/muru /home/muru/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# sudo -u muru sh -c 'echo $HOME $PATH'
/root /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# ssh muru@localhost 'echo $HOME $PATH'
/home/muru /home/muru/devel/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
Run Code Online (Sandbox Code Playgroud)
即使使用 SSH,如果您运行命令而不是启动 shell,也不会运行登录 shell(请注意~/binSSH 测试中缺少 ,存在于su -和 中sudo -i)。为了获得真正的结果,我将我的 shell 作为登录 shell 运行:
# ssh muru@localhost '$SHELL -ilc "echo \$HOME \$PATH"'
/home/muru /home/muru/bin:/home/muru/devel/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
Run Code Online (Sandbox Code Playgroud)
这也是为什么sudo su,并sudo -s为获得一个root shell蹩脚的方式。这两种方式都受到环境的污染。
有关的:
| 归档时间: |
|
| 查看次数: |
8545 次 |
| 最近记录: |