登录用户和使用su通过root更改用户之间的区别是什么?

如果你有某种服务器,你可以通过ssh user1@ip访问它,你也可以使用ssh root@ip转到你的root用户su suive,然后转到su user1 。 在我的想法中,这些方式应该引导我到相同的用户环境(在这种情况下,“user1”),但在我的实际经验中它没有,导致在ssh user1@ip安装的东西在su user1中没有。

这是为什么?

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 

    /etc/pam.d/su有:

     session required pam_env.so readenv=1 envfile=/etc/default/locale 

    这意味着SSH加载~/.pam_environment ,但su不会。 这是一个很大的问题,因为~/.pam_environment是环境变量独立于shell的地方,如果您从GUI,TTY或SSH登录,它将被应用。

要启动登录shell,请运行以下任一项:

 su -  sudo -iu  

例:

 # 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 

即使使用SSH,如果运行命令而不是启动shell,也不会运行登录shell(注意SSH测试中没有~/bin ,它存在于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 

这也是为什么sudo susudo -s是获取root shell的糟糕方法的原因。 这两种方式都受到环境的污染。


有关:

  • Unix和Linux:su vs sudo -s vs sudo -i vs sudo bash

总的来说,这主要是战略上的差异。

如果您以超级用户身份登录,则可以随时更改任何内容…即 – 没有针对灾难性错误的保护,您必须暂时更改为其他用户以确保安全。

鉴于:如果您以有限的权限登录,则可以避免发生灾难性错误的风险,因为您必须有意转移到su root以临时访问该权限,但现在您拥有安全用户的默认回落位置。

因此,差异确实是战略性的,而非技术性的。