Выбор редактора при выполнении под sudo

Вопрос или проблема

На машине с Ubuntu 12.04 я использовал систему альтернатив для установки редактора на vim.basic. Я получаю правильный редактор при работе от имени root, но не когда я использую sudo для перехода к root и запускаю crontab, и я пытаюсь понять, почему.

Немного подробнее. Альтернатива редактор в данный момент настроена на vim.basic в ручном режиме (результат обрезан):

% 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

EDITOR и SHELL как root:

# 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

Теперь я замечаю, что nano имеет более высокий приоритет (40), чем vim.basic (30), так что я могу изменить приоритет vim.basic. Но это противоречит цели ручного режима.

Обновление

Я заметил, что использование sudo -E дает правильный редактор, что подразумевает, что проблема связана с окружением. То есть:

sudo crontab -e     # используется редактор nano
sudo -E crontab -e  # используется редактор vim

В большинстве конфигураций sudo удаляет большинство переменных окружения. Вы можете увидеть конфигурацию sudo, запустив sudo -V от имени root (то есть sudo sudo -V от имени пользователя с правами sudo).

На Ubuntu переменные удаляются, кроме небольшого списка, и EDITOR и VISUAL не входят в список, который нужно сохранять. Поэтому когда вы выполняете sudo somecommand, ваши пользовательские предпочтения редактора не применяются при выполнении somecommand.

Когда вы выполняете sudo -e (--edit), файл копируется во временное место, затем sudo запускает ваш редактор без дополнительных прав, и, наконец, временный файл перемещается в конечное место, если редактор возвращает успешный статус. Поскольку редактор выполняется без дополнительных привилегий, sudo не удаляет окружение.

Вы должны использовать sudo -e когда это возможно, так как это позволяет вам запускать ваш любимый редактор без опасений по поводу запуска программ с повышенными привилегиями. Когда это невозможно (например, чтобы запустить crontab -e), вы можете выбрать ваш редактор, определив ваше предпочтение снова внутри команды, выполняемой sudo:

sudo env VISUAL=vim crontab -e

Ответ или решение

Когда дело доходит до выбора текстового редактора для выполнения команд с привилегиями суперпользователя (root) с помощью sudo, необходимо понимать, как работает окружение команд и какие переменные среда влияют на ваш выбор редактора. Рассмотрим детально вашу ситуацию на системе Ubuntu 12.04.

Проблема с выбором редактора

Вы настроили редактор по умолчанию на вашем компьютере с Ubuntu на vim.basic, что явно видно из вывода команды update-alternatives. Однако при использовании команды sudo crontab -e открывается редактор nano, даже если вы ожидали увидеть vim.basic.

Причиной данной проблемы является то, как команда sudo управляет переменными окружения. По умолчанию при выполнении команды с помощью sudo происходит обрезка большинства переменных окружения, за исключением небольшого набора переменных, которые разрешены для передачи. Как показывает практика, переменные EDITOR и VISUAL не входят в этот список.

Поведение sudo и его влияние на редактор

Когда вы выполняете команду sudo crontab -e, sudo использует редактор по умолчанию, указанный в переменной окружения EDITOR, которую оно не передает. В результате, если у пользователя настроен EDITOR как vim, и он использует sudo, этот выбор игнорируется, и по умолчанию открывается nano, который имеет более высокий приоритет в системе.

Однако, когда вы запускаете sudo -E crontab -e, вы явно передаете все переменные окружения, включая EDITOR, что позволяет системе использовать ваш предпочтительный текстовый редактор, что подтверждает правильную работу команды.

Рекомендации по исправлению ситуации

  1. Использование sudo -E: Поскольку использование sudo -E позволяет сохранить ваши переменные окружения, это наиболее простое и более безопасное решение для запуска команд с использованием ваших предпочтений.

  2. Команда env: Если использование -E не подходит по каким-либо причинам, вы можете явно установить переменную EDITOR в команде, которую вы хотите выполнить с sudo:

    sudo env EDITOR=vim crontab -e
  3. Настройка конфигурации sudo: Интересно отметить, что вы можете изменить конфигурацию sudo, чтобы разрешить передачу переменной EDITOR, отредактировав файл /etc/sudoers. Однако это может быть рискованным шагом, так как может сократить уровень безопасности.

  4. Используйте sudo -e: Когда это возможно, используйте sudo -e для редактирования файлов. Это позволяет редактору запускаться с привилегиями пользователя, а не суперпользователя, и сохраняет переменные окружения, что позволяет использовать выбранный вами редактор без необходимости в дополнительных настройках.

Заключение

Проблема с выбором редактора при использовании sudo на Ubuntu 12.04 связана с тем, как sudo обрабатывает переменные окружения. Понимание этих нюансов поможет вам правильно наладить работу с текстовыми редакторами, сохраняя при этом безопасность вашей системы. Использование sudo -E или явное указание переменной EDITOR гарантируют, что вы будете использовать предпочитаемый вами редактор, что делает работу более комфортной и эффективной.

Оцените материал
Добавить комментарий

Капча загружается...