当您拥有某种服务器时,您可以通过以下方式访问它,例如,ssh user1@ip
您也可以ssh root@ip
使用su priveleges转到根用户,然后转到su user1
。在我的想法中,这两种方式都应该将我引导到相同的用户环境(在本例中为“ user1”),但是根据我的实际经验,并不会导致ssh user1@ip
安装了某些东西su user1
。
这是为什么?
当您拥有某种服务器时,您可以通过以下方式访问它,例如,ssh user1@ip
您也可以ssh root@ip
使用su priveleges转到根用户,然后转到su user1
。在我的想法中,这两种方式都应该将我引导到相同的用户环境(在本例中为“ user1”),但是根据我的实际经验,并不会导致ssh user1@ip
安装了某些东西su user1
。
这是为什么?
Answers:
SSH启动登录外壳程序。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
而/etc/pam.d/su
具有:
session required pam_env.so readenv=1 envfile=/etc/default/locale
这意味着SSH加载~/.pam_environment
,但su
不是。这是一个很大的问题,因为~/.pam_environment
它是环境变量与外壳程序无关的位置,并且如果您从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,如果您运行命令而不是启动外壳程序,也不会运行登录外壳程序(请注意~/bin
SSH测试中缺少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
是获取根shell的糟糕方法。这两种方式都被环境污染。
有关:
总的来说,这主要是战略差异。
如果您以超级用户身份登录,则可以随时更改任何内容……即-没有针对灾难性错误的保护措施,为了安全起见,您必须临时更改为其他用户。
而:如果您以有限的权限登录,则可以避免灾难性错误,因为您必须有意转移到su root才能暂时使用该功能,但是现在您拥有默认的安全用户后备位置。
因此,差异实际上是战略性的,而不是技术性的。