27

Если я выпущу

sudo my-command

как Linux ищет эту my-command?

my-command находится в моем пути. Я могу вызвать это без каких-либо проблем. Однако, когда я вызываю его с помощью sudo , я получаю command not found . Интересно, никогда не испытывай этого раньше. Как побороть?

РЕДАКТИРОВАТЬ: выбранный ответ "Возможный дубликат" является неправильным, ну, по крайней мере, не в точку. Этот ответ от Тердона является правильным.

2 ответа2

35

Обычно это устанавливается параметром secure_path в /etc/sudoers . От man sudoers:

 secure_path   Path used for every command run from sudo.  If you don't
               trust the people running sudo to have a sane PATH environ‐
               ment variable you may want to use this.  Another use is if
               you want to have the “root path” be separate from the “user
               path”.  Users in the group specified by the exempt_group
               option are not affected by secure_path.  This option is not
               set by default.

Для запуска команд, которые не входят в стандартную $PATH , вы можете

  1. Используйте полный путь: sudo ~/bin/my-command ; или же

  2. Добавьте каталог, содержащий команду, в secure_path . Запустите sudo visudo и отредактируйте строку безопасного пути:

    Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/youruser/bin/"
    

    Сохраните файл, и в следующий раз, когда вы запустите sudo , каталог ~/bin будет находиться в $PATH .

2

Вот что я использовал для обхода проблемы:

sudo cp $(which my-command) /usr/bin
...

Команда which выполняется в подоболочке без полномочий root, поэтому она может найти my-command , а затем sudo копирует исполняемый файл в путь, к которому может получить доступ пользователь root . Не очень хорошо для безопасности, но для меня было нормальным запускать образ докера, который уничтожался сразу после запуска команды.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .