Intereting Posts

Sudo – целевая пользовательская среда

Есть ли способ (без перескакивания слишком большого количества обручей) для запуска команды sudo -u user command таким образом, чтобы среда пользователя полностью сохранялась?

В принципе, мне нужно обеспечить, чтобы определенные переменные среды были установлены для всех пользователей, которым разрешено запускать sudo для олицетворения определенных идентификаторов – в основном такие PATH , как PATH , JAVA_HOME и связанные с базой данных (Oracle и Postgres).

Другими словами – когда я, как пользователь, sudo -u wibble echo $PATH , запустил sudo -u wibble echo $PATH Я бы хотел видеть, wibble путь wibble отображается вместо wobble .

Вы, безусловно, можете сделать следующее для всех пользователей или заданного пользовательского колебания, однако оно применяется ко всем командам sudo -u anyuser . Отредактируйте файл /etc/sudoers и добавьте строку типа

 Defaults env_keep+="PATH JAVA_HOME" 

для всех пользователей или

 Defaults:wobble env_keep+="PATH JAVA_HOME" 

для просто колебания, со всеми переменными, которые вы хотите сохранить. На самом деле, PATH обычно является особым случаем и сбрасывается, поэтому вам может потребоваться отменить это с помощью записи типа

 Defaults:wobble !secure_path, env_keep+="PATH JAVA_HOME" 

Очевидно, что эти функции есть по уважительной причине, так что будьте осторожны.

Существует также возможность сохранения среды с помощью sudo -E которая может быть разрешена вводом sudoers, например:

 wobble ALL = (wibble) SETENV: ALL 

но это все равно перезапустит специальный случай PATH, хотя вы можете запускать команды вроде

 sudo -E PATH=$PATH -u wibble ... 

Вы можете использовать sudo -i для полного входа в систему для пользователя, поэтому sudo -i -u wibble command войдет в систему как wibble, настроит все его окружения vars и выполнит команду как этот пользователь.

Однако sudo -i -u wibble echo $HOME все равно распечатает ваш домашний путь. Это связано с тем, что ваше приглашение расширяет $ HOME var до того, как sudo даже запускается, и нет ничего, что могло бы сделать sudo. Поэтому, если вам нужно передать переменную окружения через командную строку, она должна быть экранирована должным образом, вот несколько примеров:

 sudo echo $HOME > /home/user sudo -i echo '$HOME' > /root sudo echo '$HOME' > $HOME sudo bash -c 'echo $HOME' > /root sudo -i bash -c 'echo $HOME' > /root 

Для этого вы можете добавить -u wibble (перед командой), чтобы вместо этого запускать их как wibble.