Вопрос или проблема
На машине с 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
, что позволяет системе использовать ваш предпочтительный текстовый редактор, что подтверждает правильную работу команды.
Рекомендации по исправлению ситуации
-
Использование
sudo -E
: Поскольку использованиеsudo -E
позволяет сохранить ваши переменные окружения, это наиболее простое и более безопасное решение для запуска команд с использованием ваших предпочтений. -
Команда
env
: Если использование-E
не подходит по каким-либо причинам, вы можете явно установить переменнуюEDITOR
в команде, которую вы хотите выполнить сsudo
:sudo env EDITOR=vim crontab -e
-
Настройка конфигурации
sudo
: Интересно отметить, что вы можете изменить конфигурациюsudo
, чтобы разрешить передачу переменнойEDITOR
, отредактировав файл/etc/sudoers
. Однако это может быть рискованным шагом, так как может сократить уровень безопасности. -
Используйте
sudo -e
: Когда это возможно, используйтеsudo -e
для редактирования файлов. Это позволяет редактору запускаться с привилегиями пользователя, а не суперпользователя, и сохраняет переменные окружения, что позволяет использовать выбранный вами редактор без необходимости в дополнительных настройках.
Заключение
Проблема с выбором редактора при использовании sudo
на Ubuntu 12.04 связана с тем, как sudo
обрабатывает переменные окружения. Понимание этих нюансов поможет вам правильно наладить работу с текстовыми редакторами, сохраняя при этом безопасность вашей системы. Использование sudo -E
или явное указание переменной EDITOR
гарантируют, что вы будете использовать предпочитаемый вами редактор, что делает работу более комфортной и эффективной.