13

Короче говоря: как заставить sudo не сбрасывать PATH каждый раз?

У меня есть несколько сайтов, развернутых на моем сервере (тестирование Debian), написанных на Ruby on Rails. Я использую Mongrel+Nginx для их размещения, но есть одна проблема, которая возникает, когда мне нужно перезапустить Mongrel (например, после внесения некоторых изменений).

Все сайты проверяются в VCS (git, но это не важно) и имеют владельца и группу, установленные для моего пользователя, в то время как Mongrel работает от имени пользователя-монгрела, который строго ограничен в своих правах. Таким образом, Mongrel должен быть запущен под root (он может автоматически изменять UID) или mongrel.

Для управления mongrel я использую gem mongrel_cluster, потому что он позволяет запускать или останавливать любое количество серверов Mongrel всего одной командой. Но для этого нужно, чтобы каталог /var/lib/gems/1.8/bin находился в PATH: этого недостаточно для запуска с абсолютным путем.

Модификация PATH в корне .bashrc ничего не изменила, не изменив настройки sudo env_reset и env_keep.

Итак, вопрос: как добавить каталог в PATH или сохранить PATH пользователя в sudo?

Обновление: несколько примеров

$ env | grep PATH
PATH=/usr/local/bin:/usr/bin:/bin:/usr/games:/var/lib/gems/1.8/bin
$ sudo cat /etc/sudoers | egrep -v '^$|^#'
Defaults    env_keep = "PATH"
root    ALL=(ALL) ALL
%sudo ALL=NOPASSWD: ALL
$ sudo env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

Также могу сказать, что так же работает и в стабильной Debian (lenny).

4 ответа4

12

Боролся с той же проблемой в течение нескольких часов. В Debian Lenny вы можете исправить это, добавив

Defaults        exempt_group=<your group> 

в файл sudoers.

Это единственный способ обойти скомпилированную опцию --secure-path (насколько я знаю).

В частности, это также освобождает пользователей от необходимости вводить свой пароль при выполнении sudo.

3

Если в secure_path установлен /etc/sudoers , вы можете играть с env_reset / env_keep все, что вам нравится, и это не будет иметь никакого значения для пути. Если вы видите что-то подобное, закомментируйте это.

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
0

Я бы сказал, посмотрите параметры env_reset и env_keep в man sudo. Но похоже, что вы уже сделали это (вы просто по ошибке называете env_keep "keepenv"). Если вы отключите опцию env_reset (по умолчанию включено), я думаю, что она не должна стирать никакие переменные env. Но это менее безопасно.

Есть также опция secure_path для sudo; Я думаю, что это включено по умолчанию. Вы можете попробовать отключить его.

Предыдущие параметры задаются в вашем файле /etc /sudoers. Также есть опция командной строки -i для sudo. Это заставит sudo запустить /root/.profile или /root/.login. Вы можете установить желаемый путь там.

-1

Ну, вы делаете что-то не так. Кроме того, вы не указали, что вы сделали с вашим файлом /etc /sudoers. Вот что вы должны были сделать - это система CentOS, кстати:

Во-первых, это с правильной настройкой env_keep (обратите внимание, что там есть PATH):

Sudo Grep -5 путь / и т.д. / sudoers по умолчанию env_keep = "дисплей цветов HOSTNAME HISTSIZE INPUTRC KDEDIR \ LS_COLORS MAIL PS1 PS2 QTDIR ИМЯ_ПОЛЬЗОВАТЕЛЯ \ LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY lc_name LC_NUMERIC \ LC_PAPER LC_TELEPHONE LC_TIME LC_ALL ЯЗЫК LINGUAS \ _XKB_CHARSET XAUTHORITY PATH"

Defaults   timestamp_timeout = 15 

## Next comes the main part: which users can run what software on 
## which machines (the sudoers file can be shared between multiple

-> export PATH=$PATH:hithere
-> sudo sh -c 'echo $PATH'
/sbin:/bin:/usr/sbin:/usr/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/bin:hithere

Выглядит хорошо. Теперь давайте удалим настройку env_keep и попробуем снова:

-> sudo visudo
-> sudo grep -5 PATH /etc/sudoers
                    LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                    LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                    LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                    LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                    _XKB_CHARSET XAUTHORITY"
 #_XKB_CHARSET XAUTHORITY PATH"

Какой печальный путь

 -> sudo sh -c 'echo $PATH'
 /usr/bin:/bin

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