Emacs 在 su 到 root 后加载用户配置文件

Posted

技术标签:

【中文标题】Emacs 在 su 到 root 后加载用户配置文件【英文标题】:Emacs loading user configuration file after su to root 【发布时间】:2019-05-16 05:33:09 【问题描述】:

在我的 ArchLinux 数字计算器上,我有两个帐户:一个用户帐户 (benj) 和 root 帐户。

对于管理任务,我使用我的用户帐户 ssh 进入机器。打开外壳后,我使用 su 切换到 root。

现在运行 emacs 会显示在初始化期间出现问题的错误

Warning (initialization): An error occurred while loading ‘/home/benj/.emacs.d/init.el’:

File is missing: Cannot open load file, No such file or directory, ~/.emacs.d/init-modules/emacs-lisp-package-archive.el

To ensure normal operation, you should investigate and remove the cause of the error in your initialization file.  Start Emacs with the ‘--debug-init’ option to view a complete error backtrace.

我的~benj/.emacs.d/init.el 是模块化的,而~root/.emacs.d/init.el 不是。我不明白为什么 emacs 试图加载我用户的配置文件。

echo $HOME              # Shows /root
alias | grep emacs      # Shows nothing
which emacs             # /user/bin/emacs
emacs --version         # GNU Emacs 26.1
                        # Copyright (C) 2018 Free Software Foundation, Inc.
                        # GNU Emacs comes with ABSOLUTELY NO WARRANTY.
                        # You may redistribute copies of GNU Emacs
                        # under the terms of the GNU General Public License.
                        # For more information about these matters, see the file named COPYING.

但是,在 TTY1 上登录 root 时,user-init-file 上的 M-x describe-variable 返回预期的 /root/.emacs.d/init.el

【问题讨论】:

我不明白为什么 emacs 试图加载我用户的配置文件。您的意思是它正在尝试加载根配置文件?您说过根目录不包含init-modules 文件夹,对吧?错误说emacs基本上找不到init-modules文件夹。 错误信息显示:An error occurred while loading '/home/benj/.emacs.d/init.el。所以他试图加载用户 benj 的配置文件,而不是 root 的文件。但是,他在通过 TTY1 登录时加载了root 的配置 【参考方案1】:

C-hig (emacs)Find Init 说:

Emacs 如何找到你的初始化文件

通常 Emacs 使用环境变量 ‘HOME’ (*note HOME: General 变量。)查找“.emacs”;这就是“~”在文件名中的含义。如果 '.emacs' 在'~/' 中找不到(也不是'.emacs.el'),Emacs 寻找 ‘~/.emacs.d/init.el’(与‘~/.emacs.el’一样,可以进行字节编译)。

但是,如果你从一个由“su”启动的 shell 运行 Emacs,Emacs 会尝试 找到您自己的“.emacs”,而不是您当前的用户 假装是。这个想法是你应该拥有自己的编辑器 即使您以超级用户身份运行,也可以自定义。

更准确地说,Emacs 首先确定要使用哪个用户的 init 文件。 它从环境变量“LOGNAME”和 '用户';如果这些都不存在,则它使用有效的用户 ID。如果说 用户名与真实用户 ID 匹配,然后 Emacs 使用“HOME”;除此以外, 它查找与该用户名对应的主目录 系统的用户数据库。

【讨论】:

emacs 是怎么做到的? 我不确定我是否理解这个问题。您是否在询问引文最后一段中未详细说明的内容? 这很烦人。我在我的用户初始化文件中使用带有 ~ 的路径,所以在 su root 之后,emacs 加载用户初始化文件但将 ~ 扩展为 root,所以它得到所有路径错误:( @knarf 您是说上面引用的文档在您的情况下不正确吗?哪个版本的 Emacs?您的版本中的手册是否与我引用的内容相同?在使用su 之后,您是否检查了所有提到的环境变量?

以上是关于Emacs 在 su 到 root 后加载用户配置文件的主要内容,如果未能解决你的问题,请参考以下文章

linux 禁止普通用户使用su切换到root用户和禁止 root ssh登陆

su命令 sudo命令 限制root远程登录

用ssh远程登录服务器时,怎么直接以root用户登录?(需要修改配置,如果不想修改,可以先用普通用户登录再su切换到root用户)

Linux下文件 ~/.bashrc 和 ~/.bash_profile 和 /etc/bashrc 和 /etc/profile 的区别 | 用户登录后加载配置文件的顺序

权限管理禁止用户su - root并记录用户操作记录实验!

运维人员权限分配