Я использую 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
для выполнения исполняемых файлов.
Если я бегу:
$ gemname
мой инструмент работает правильно.$ sudo gemname
это просто говорит мне command not found
.$ sudo echo $PATH
Это делает покажите правильный путь.$ sudo -i gemname
он работает правильно.$ sudo sudo -V
показывает, что ПУТЬ сохраняется.Делает 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
не в твоем $PATH
Это круто: расширение переменной происходит до того, как bash запустит программу. Итак, когда вы запустите это, он расширяется до вашего пользователя $PATH
перед вызывая sudo, поэтому строка, переданная в sudo, больше похожа на:
$ sudo echo "/usr/bin:/bin:"
sudo -i
работает как оболочка входа в систему и уважает .profile
и / или .login
. Как по man
страница говорит:
Он также инициализирует среду, оставляя DISPLAY и TERM без изменений, устанавливая HOME, MAIL, SHELL, USER, LOGNAME и PATH, а также содержимое / etc / environment в системах Linux и AIX. Все остальные переменные среды удаляются.