Escolha do editor ao executar sob o sudo

2

Em uma máquina Ubuntu 12.04, usei o sistema de alternativas para definir o editor como vim.basic . Eu recebo o editor correto quando root, mas não quando eu sudo para root e executar o crontab, e estou tentando entender o porquê.

Um pouco mais detalhadamente. O editor alternativo está atualmente configurado para vim.basic pelo modo manual (saída aparada):

% 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'.

Se eu sudo para fazer o root e editar o crontab, o editor é vim.basic:

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

EDITOR e SHELL como root:

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

No entanto, como um usuário normal, se eu sudo crontab o editor é nano:

% sudo crontab -e
# GNU nano 2.2.6

EDITOR e SHELL como usuário normal:

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

Agora eu estou percebendo que nano tem uma prioridade mais alta (40) do que vim.basic (30), então eu poderia mudar a prioridade do vim.basic. Mas isso anula o propósito do modo manual .

Atualizar

Eu notei que usar sudo -E fornece o editor correto, o que implica que o problema está relacionado ao ambiente. Isso é:

sudo crontab -e     # nano editor is used
sudo -E crontab -e  # vim editor is used
    
por Sonia Hamilton 11.09.2014 / 05:02

1 resposta

2

Na maioria das configurações, o sudo remove a maioria das variáveis de ambiente. Você pode ver a configuração do sudo executando sudo -V como root (então sudo sudo -V como um usuário com permissões sudo).

No Ubuntu, as variáveis são removidas, exceto em uma lista pequena, e EDITOR e VISUAL não estão na lista para serem preservadas. Portanto, quando você executar sudo somecommand , suas preferências de editor por usuário não serão aplicadas ao executar somecommand .

Quando você executa sudo -E , o arquivo é copiado para um local temporário, o sudo executa o editor sem privilégios adicionais e, finalmente, o arquivo temporário é movido para o local final se o editor retornar um status de sucesso. Como o editor é executado sem privilégios adicionais, o sudo não tira o ambiente.

Você deve usar sudo -E sempre que possível, pois isso permite que você execute seu editor favorito sem preocupações sobre a execução de programas com privilégios elevados. Quando isso não for possível (por exemplo, para executar crontab -e , você pode escolher seu editor definindo sua preferência novamente dentro do comando executado pelo sudo:

sudo env VISUAL=vim crontab -e
    
por 12.09.2014 / 16:43