以用户身份登录和通过 root 使用 su 更改用户有什么区别?

Mig*_*rti 17 ssh sudo su

当您有某种服务器时,您可以通过例如访问它,ssh user1@ip并且您也可以ssh root@ip使用 su 权限转到您的 root 用户,然后转到su user1. 在我看来,这两种方式都应该引导我进入相同的用户环境(在这种情况下,“user1”),但在我的实际经验中并没有,因为ssh user1@ip安装了一些东西,su user1但没有安装。

这是为什么?

mur*_*uru 15

SSH 启动一个登录shell。su,默认情况下没有。

特别是,这意味着该用户的~/.profile(或类似文件)不是来源。因此,在 中所做的更改~/.profile不会生效。也可能是这样:

  • 即使您启动了登录 shell,root 的 也进行了不同的更改~/.profile,这可能会污染用户的环境。
    • /etc/profile并且/etc/profile.d/*可能会为不同的用户应用不同的设置(但不是默认情况下)
  • 在 SSH 配置中,不同的用户可能有不同的设置。
  • 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蹩脚的方式。这两种方式都受到环境的污染。


有关的:

  • 似乎我应该在回答问题之前保持清醒:) 你的回答很好,我的没有找到正确的答案。干得好 +1 (2认同)