根据man sudo
sudo -i
启动登录 shell,在我的理解中应该是 read/source ~/.profile
,即/root/profile
or[non-root user home/.profile
和/etc/profile
。添加别名(例如,alias ll='ls -la'
向两个文件添加别名)不会使别名在 . 启动的 shell 中可用sudo -i
。如果我bash
在 shell 中运行,则sudo -i
别名可用。
我已经想出将别名/etc/profile.d/00-aliases.sh
放入https://askubuntu.com/questions/810730/how-to-share-bash-aliases- Between-non-root-user-bash-and-shell-opened-by-sudo。在这里我只想知道为什么预期的行为没有发生。
我将此报告为launchpad.net 上的 sudo 错误,但现在我不确定这是否是预期行为的一个棘手方面。无论如何man sudo
描述的方式-i
都太琐碎了。
答案1
读取的文件取决于目标用户的 shell。因此,例如,如果您sudo -u user1 -i
和 user1 使用,csh
那么它将读取~user1/.login
。对于 ksh 用户来说,它是~user1/.profile
.
对于bash
用户(例如root
),读取的文件~/.bash_profile
是否存在,并回退到~/.profile
例如
% sudo head -1 /root/.bash_profile /root/.profile
==> /root/.bash_profile <==
echo RUNNING BASH_PROFILE
==> /root/.profile <==
echo RUNNING PROFILE
% sudo -i
RUNNING BASH_PROFILE
root@server:~# rm /root/.bash_profile
root@server:~# exit
logout
% sudo -i
RUNNING PROFILE
root@server:~#
.bash_profile
所以我们可以看到阻止.profile
运行的存在。这是bash
登录 shell 的正常行为,无论是通过 ssh 登录还是通过sudo -i
.