在 sudo 下运行时选择编辑器

在 sudo 下运行时选择编辑器

在 Ubuntu 12.04 机器上,我使用替代系统来设置编辑vim 基本版。当 root 时我得到了正确的编辑器,但当我 sudo 到 root 并运行 crontab 时却没有,我试图理解为什么。

更详细一点。另一种选择编辑目前设置为vim 基本版通过手动模式(输出调整):

% sudo update-alternatives --set editor /usr/bin/vim.basic
% update-alternatives --display editor
editor - manual mode
  link currently points to /usr/bin/vim.basic
/bin/nano - priority 40
  slave editor.1.gz: /usr/share/man/man1/nano.1.gz
/usr/bin/vim.basic - priority 30
  slave editor.1.gz: /usr/share/man/man1/vim.1.gz
  slave editor.fr.1.gz: /usr/share/man/fr/man1/vim.1.gz
  slave editor.it.1.gz: /usr/share/man/it/man1/vim.1.gz
  slave editor.pl.1.gz: /usr/share/man/pl/man1/vim.1.gz
  slave editor.ru.1.gz: /usr/share/man/ru/man1/vim.1.gz
Current 'best' version is '/bin/nano'.

如果我 sudo 到 root 并编辑 crontab 编辑器是 vim.basic:

% sudo -i
% crontab -e
# editor is vim; :help shows
# *help.txt*      For Vim version 7.3.  Last change: 2010 Jul 20

作为 root 的 EDITOR 和 SHELL:

# env | grep -i editor
EDITOR=vim
# echo $0
-bash

但是,作为普通用户,如果我 sudo crontab 编辑器是 nano:

% sudo crontab -e
# GNU nano 2.2.6

作为普通用户的 EDITOR 和 SHELL:

% env | grep -i editor
EDITOR=vim
% echo $0
zsh

现在我注意到纳米具有比以下更高的优先级 (40)vim 基本版(30),这样我就可以改变 vim.basic 的优先级。但这违背了目的手动模式

更新

我注意到使用须藤-E给出了正确的编辑器,这意味着问题与环境有关。那是:

sudo crontab -e     # nano editor is used
sudo -E crontab -e  # vim editor is used

答案1

在大多数配置中,sudo 会删除大多数环境变量。您可以通过sudo -V以 root 身份(即sudo sudo -V具有 sudo 权限的用户)运行来查看 sudo 配置。

在 Ubuntu 上,除了一个小列表之外,变量都会被删除,并且EDITORVISUAL不在要保留的列表中。因此,当您运行时sudo somecommand,您的每用户编辑器首选项不会在运行时应用somecommand

当您运行 时sudo -E,文件将被复制到临时位置,然后 sudo 运行您的编辑器而无需任何其他权限,最后,如果编辑器返回成功状态,则临时文件将被移动到最终位置。由于编辑器是在没有额外权限的情况下执行的,因此 sudo 不会剥离环境。

您应该sudo -E尽可能使用,因为这可以让您运行您最喜欢的编辑器,而不必担心以提升的权限运行程序。如果这是不可能的(例如,要运行 )crontab -e,您可以通过在 sudo 执行的命令中再次定义您的首选项来选择您的编辑器:

sudo env VISUAL=vim crontab -e

相关内容