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 su
和
sudo -s
是获取root shell的糟糕方式。这两种方式都受到环境的干扰。
相关内容: