Почему я не могу выполнить sudo некоторые команды? (например, vim)

Почему я не могу выполнить sudo некоторые команды? (например, vim)

У меня есть доступ sudo на сервере моего друга, работающем под управлением centos-6.3, но когда я пытаюсь выполнить некоторые команды, sudo vim /var/www/html/index.htmlя получаю сообщение об ошибке sudo: vim: command not found, однако я могу запустить sudo suи затем , vim /var/www/html/index.htmlи все работает так, как и ожидалось.

echo $PATHи sudo echo $PATHоба результата:

/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/jared/bin

sudo which vimоднако дает:

which: no vim in (/sbin:/bin:/usr/sbin:/usr/bin)

Я пробовал добавлять

export PATH=$PATH:/usr/local/bin

к /root/.bashrcкоторому как исправлена ​​проблема при использовании, sudo suно не только sudo <command>.

Как мне добраться sudo <command>до работы?

решение1

При запуске sudoмногие системы настроены на очистку среды от всех значений, не входящих в белый список, и сброс переменной PATH до очищенного значения.

Первый вариант вы найдете как Defaults env_resetи несколько Defaults env_keep += "SOME_VARIABLE_NAME"в /etc/sudoers. Последний вариант «безопасного» PATHпереопределения указан как Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin– удалите эту строку, чтобы удалить это поведение при sudoing.


То, какая переменная среды обрабатывается, отображается при  sudo -Vзапуске root.


Если вы не хотите избавляться от этих значений по умолчанию, вы всегда можете указать программы, используя их полный путь ( sudo /usr/local/bin/vim).

В качестве альтернативы вы можете разрешить своей учетной записи находиться SETENVв sudoersфайле, например:

%wheel  ALL=(ALL)       SETENV: ALL

Это позволяет вам переопределять значения среды по умолчанию следующим образом: sudo PATH=$PATH which vim, поскольку переменная интерпретируется вашей оболочкой до выполнения команды, что приводит к унаследованному значению PATH(которое, скорее всего, не будет включать /sbinи т. д.).

решение2

sudo echo $PATH

не делает то, что вы думаете. $PATHзаменяется (вашей) оболочкойдовыполнение команды.

Чтобы добиться желаемого поведения, вы можете использовать sudo -i.

Отчеловек судо:

-i [команда]

The(имитировать первоначальный вход в систему) опция запускает оболочку, указанную впароль(5) запись целевого пользователя как оболочки входа. Это означает, что файлы ресурсов, специфичные для входа, такие как .profileили .loginбудут прочитаны оболочкой. Если указана команда, она передается оболочке для выполнения.

решение3

Как мне добраться sudo <command>до работы?

Пока вы не решите проблему с путями, используйте полный путь.

  sudo /usr/local/bin/vim /var/www/html/index.html

Связанный контент