Назад | Перейти на главную страницу

Как `sudo` ищет исполняемые файлы по пути?

Я использую rubygems (1.3.7) с драгоценными камнями, для которых требуются права root в Ubuntu 10.10. Когда я сравниваю свою установку с ubuntu 9.10 с установкой rubygems 1.3.6, я вижу следующую разницу в gem environment:

1.3.7 / 10.10 - EXECUTABLE DIRECTORY: /var/lib/gems/1.8/bin

1.3.6 / 09.10 - EXECUTABLE DIRECTORY: /usr/bin

Результат будет таким же, если я использую sudo или не. Чтобы исправить это (я не знаю, почему это в первую очередь отличается), я попытался изменить свою переменную пути.

У меня вопрос, а где же sudo ищите исполняемые файлы? Если я установлю гем (используя sudo) исполняемый файл помещается в /var путь очевидно. Я добавил этот путь в свой ~/.profile и /etc/environment файлы, но я не могу получить sudo для выполнения исполняемых файлов.

Если я бегу:

Делает sudo честь ~/.profile и / или /etc/environment? Если да, то почему они не могут найти мой исполняемый файл, пока каталог отображается в $PATH переменная окружения?

Я прочитал документацию sudo, Я также искал и просмотрел массу тем о stackoverflow и serverfault (например, Как переопределить переменную среды PATH в sudo?, но мой пример показывает, что $PATH содержит правильный путь), но на самом деле они никогда не показывают, как запустить гем через sudo.

Обратите внимание, что в вашей третьей команде ваша оболочка расширяется $PATH прежде, чем sudo увидит его, и поэтому на выходе будет путь к вашей оболочке, а не PATH, который видит sudo. Вы хотите что-то вроде sudo echo \$PATH или sudo sh -c 'echo $PATH'.

Помимо этого, взгляните на раздел ЗАМЕТКИ О БЕЗОПАСНОСТИ sudo(8) справочная страница. Я считаю, что Ubuntu строит sudo с параметром сборки SECURE_PATH. Найдите строку «Значение для переопределения $ PATH пользователя с помощью» в выходных данных sudo sudo -V.

sudo -i имитирует первоначальный вход в систему и будет читать такие файлы, как .profile (хотя то, какие файлы он читает, зависит от оболочки root). Без -i, он наследует сохраненные переменные окружения от окружения вызывающего его с помощью упомянутой выше очистки PATH.

Что касается того, почему изначально изменился путь, я подозреваю, что это изменение было сознательным выбором со стороны разработчиков. Смотрите больше обсуждения на bugs.debian.org.

Пойдем по частям:

  • gemname он правильно запускает мой инструмент.

Все нормально :)

  • sudo gemname просто сообщает мне, что команда не найдена.

gemname не в твоем $PATH

  • sudo echo $ PATH показывает правильный путь.

Это круто: расширение переменной происходит до того, как bash запустит программу. Итак, когда вы запустите это, он расширяется до вашего пользователя $PATH перед вызывая sudo, поэтому строка, переданная в sudo, больше похожа на:

$ sudo echo "/usr/bin:/bin:"
  • sudo -i gemname работает правильно.

sudo -i работает как оболочка входа в систему и уважает .profile и / или .login. Как по man страница говорит:

Он также инициализирует среду, оставляя DISPLAY и TERM без изменений, устанавливая HOME, MAIL, SHELL, USER, LOGNAME и PATH, а также содержимое / etc / environment в системах Linux и AIX. Все остальные переменные среды удаляются.