登陆用户和通过root使用su切换用户之间有什么区别?

当你拥有某种类型的服务器时,你可以通过例如ssh user1@ip来访问它,你也可以使用ssh root@ip以su特权进入root用户,然后再使用su user1切换到user1用户。按照我的理解,这两种方式应该都会带我进入相同的用户环境(在这种情况下是"user1"),但根据我的实际经验,事实并非如此,因为在ssh user1@ip中安装了一些在su user1中没有的东西。
为什么会这样呢?
2个回答

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 - <username>
sudo -iu <username>

例子:

# 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的糟糕方式。这两种方式都受到环境的干扰。

相关内容:


2看来在回答问题之前我应该清醒一下 :) 你的回答很棒,而我的回答却没有达到正确的目标。干得好 +1 - Videonauth

总的来说,这主要是一种战略上的差异。
如果您以超级用户身份登录,您可以随时更改任何内容...也就是说,没有防止灾难性错误的保护措施,您必须暂时切换到其他用户以确保安全。
而:如果您以有限权限登录,您可以避免一些灾难性错误的风险,因为您必须有意地切换到su root以临时访问该权限,但现在您有了默认的后备位置,即一个安全用户。
因此,这个差异实际上是战略上的,而不是技术上的。

问题并不完全是root用户与其他用户之间的区别。而是直接通过ssh访问服务器用户和通过su已经在root用户内部访问它之间的区别。无论如何,我也同意你说的哈哈,谢谢。 - Miguel Corti
啊,好的,抱歉……我其实在想为什么大家都在讲技术细节,可能是我误解了你的意图。 - Mr.President