登录用户和使用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 su
和sudo -s
是获取root shell的糟糕方法的原因。 这两种方式都受到环境的污染。
有关:
- Unix和Linux:su vs sudo -s vs sudo -i vs sudo bash
总的来说,这主要是战略上的差异。
如果您以超级用户身份登录,则可以随时更改任何内容…即 – 没有针对灾难性错误的保护,您必须暂时更改为其他用户以确保安全。
鉴于:如果您以有限的权限登录,则可以避免发生灾难性错误的风险,因为您必须有意转移到su root以临时访问该权限,但现在您拥有安全用户的默认回落位置。
因此,差异确实是战略性的,而非技术性的。