在现有的 CentOS 6.1 安装中,如果我使用所有常用的命令别名在用户 shell(tcsh)中启动,并按照我通常的方式(在其他版本的 Linux 和 Mac OS X 中)获取 root shell,
sudo tcsh
我的命令别名是不是保存。这是不是我在其他操作系统上看到 sudo 的行为,包括旧版本的 RHEL(CentOS 就是从它派生出来的)。我在 CentOS 6.1 中尝试了不同的版本,例如
sudo -i tcsh
sudo tcsh -m
sudo -i tcsh -m
根据我对 sudo 和 tcsh 手册页的阅读,它应该会使其行为更像登录 shell,并且可能执行诸如解释我的 .cshrc 文件之类的操作,但没有任何效果。我的默认 shell 是 /etc/passwd 中的 /bin/tcsh;我尝试将 /etc/passwd 中的 root 条目切换为也使用 /bin/tcsh(默认为 /bin/bash),但没有任何变化。
我猜测这种行为可以通过 /etc/sudoers 中的某些内容来控制,但是我的 /etc/sudoers 是 CentOS 6.1 安装的库存文件,并且将它与(例如)Mac OS X 10.6 的 /etc/sudoers 文件进行比较并不能立即显示可以控制这种特定行为的明显设置。
我目前很困惑,希望得到帮助。
答案1
在 tcsh 中,别名是定义它们的 shell 实例的本地别名。您必须安排在每个子 shell 中重新定义它们。当 tcsh 启动时,它会从中读取命令$HOME/.tcshrc
($HOME/.cshrc
如果不存在);假设您在此处设置了别名。
该命令通过设置(和各种其他环境变量)为目标用户来sudo -i
“模拟初始登录” 。$HOME
更远,最新版本如果该选项存在于 中,则sudo$HOME
从环境中删除。env_reset
/etc/sudoers
因此,要使 root shell 成为.tcshrc
调用 sudo 的用户的源,请使用sudo -s
,并将以下行添加到/etc/sudoers
:
Defaults env_keep += HOME
或者,您可以将以下内容添加到/root/.tcshrc
:
if ( $?SUDO_USER ) then
source ~$SUDO_USER/.tcshrc
endif
答案2
当您使用 sudo 时,您进入的是 root shell,而不是您自己的 shell。您可以将别名添加到 /root/.cshrc,以便在您使用 sudo 时可以使用别名。