如何正确设置 sudo/visudo 的编辑器?

Mar*_*k C 19 linux sudo ubuntu sudoers ubuntu-10.04

我正在使用 Ubuntu 10.04 Server 并尝试设置 sudoers 以尊重用户的 EDITOR 选择(在限制范围内)

在我的 sudoers 中,我有:

Defaults        editor=/usr/bin/nano:/usr/bin/vim
Defaults        env_reset
Run Code Online (Sandbox Code Playgroud)

在用户 .bashrc 中:

export EDITOR=/usr/bin/vim
Run Code Online (Sandbox Code Playgroud)

$EDITOR 设置:

$ echo $EDITOR
/usr/bin/vim
Run Code Online (Sandbox Code Playgroud)

根据man sudoers这应该足以将 $EDITOR 设置为 vim:

editor  A colon (':') separated list of editors allowed to be used with visudo.
        visudo will choose the editor that matches the user's EDITOR environment
        variable if possible, or the first editor in the list that exists and is
        executable. The default is the path to vi on your system.
Run Code Online (Sandbox Code Playgroud)

但是nano,该用户仍在使用。快速检查 env:

$ sudo -- env | grep EDITOR
Run Code Online (Sandbox Code Playgroud)

什么都不返回。

$ sudo -E -- env | grep EDITOR
Run Code Online (Sandbox Code Playgroud)

退货 EDITOR=/usr/bin/vim

我知道我可以做以下事情来使 EDITOR 工作:

  • 设置env_editorenv_keep+=EDITOR或者保持EDITOR变量在sudoers中任何其他选项:我不想这样做,因为它可能允许任何任意执行(例如export EDITOR=~/bad_program_to_run_as_root
  • 使用sudo -E甚至alias sudo='sudo -E':在env_reset没有 SETENV 的情况下打败了拥有和用户的点(不是我想给出的:见上一点)得到sudo: sorry, you are not allowed to preserve the environment
  • set editor=/usr/bin/vim: 但是还有其他用户不知道vim
  • 使用sudo select-editor:关闭,但sudo visudo仍然打开nano
  • 直接使用 sudoedit 或 vim :但是这样你就失去了诸如visudo, vipw, 之类的工具的安全性crontab -e
  • 只是处理它:可能,但如果我错过了一些洞察力,我很想知道

我也试过设置VISUALSUDO_EDITOR变量(在绝望中)

有没有我错过的东西会sudo visudo在用户选择的编辑器中打开,而不会做出上述妥协?

编辑:

我想我明白为什么这不像我期望的那样工作。我把它放在这里以防其他人有同样的误解。

在 sudoers 文件中

Defaults        editor=/usr/bin/nano:/usr/bin/vim
Run Code Online (Sandbox Code Playgroud)
  • 仅指运行时允许的编辑器列表visudo(不是任何其他程序)
  • editor检查 $EDITOR,但如果正在运行sudo visudosudo则不会设置 $EDITOR,因此visudo运行时它将为空
  • 因此使用第一个编辑器,在这种情况下 nano

任何人都可以确认这是正确的吗?

因此,我希望安全的解决方案是添加:

Defaults!/usr/sbin/visudo env_keep+=EDITOR
Run Code Online (Sandbox Code Playgroud)

即当且仅当运行 visudo 时保持 EDITOR。这将被检查

Defaults                  editor=/usr/bin/nano:/usr/bin/vim
Run Code Online (Sandbox Code Playgroud)

如果它不匹配,两者都会使用 nano

奇怪的是,情况似乎并非如此:

$ sudo su - root
# export EDITOR=/bin/echo
# visudo
/etc/sudoers.tmp
visudo: /etc/sudoers.tmp unchanged
Run Code Online (Sandbox Code Playgroud)

/bin/echo用作编辑器。漏洞?还是另一种误解?

谢谢

小智 6

您是正确的,设置EDITOR变量应该更改用于sudo. 但是,还有两个其他变量优先于EDITOR:SUDO_EDITORVISUAL。确保它们都没有指向其他编辑器,例如nano.


rld*_*ld. 5

还有如描述的另一种解决方案在这里

sudo update-alternatives --config editor
Run Code Online (Sandbox Code Playgroud)

但它在多用户系统上并不是那么友好,因为它只更新 中的符号链接/usr/bin/

$ ls -l `which editor`
lrwxrwxrwx 1 root root 24 lip  4 19:37 /usr/bin/editor -> /etc/alternatives/editor

$ ls -l /etc/alternatives/editor
lrwxrwxrwx 1 root root 18 Jul  5 01:39 /etc/alternatives/editor -> /usr/bin/vim.basic
Run Code Online (Sandbox Code Playgroud)

到底是怎么回事select-editor?当我运行它时,它会创建一个文件:

$ ls -l .selected_editor 
-rw-r--r-- 1 rld rld 75 Jul  5 01:54 .selected_editor

$ cat .selected_editor 
# Generated by /usr/bin/select-editor
SELECTED_EDITOR="/usr/bin/vim.basic"
Run Code Online (Sandbox Code Playgroud)

但是sudo visudo一直在使用nano。


Яро*_*лин 2

env_reset 不会阻止用户在命令行上设置变量:

$ sudo EDITOR=vim -- env |grep EDIT
EDITOR=vim
Run Code Online (Sandbox Code Playgroud)

我发现你关于这个editor选项的发现有点令人震惊,但不幸的是我不知道你的次要问题的答案。人们可能会认为 Ubuntu 阵营在这个问题上会有大量的文档和配置示例,也许我们应该仔细看看。