Как установить переменную среды для всех в моей системе Linux?


133

Могу ли я иметь определенные настройки, универсальные для всех моих пользователей?


2
Это ЭКСПОРТ? добавьте то, и это глобально?
TIMEX

я думаю , что это только Append на текущей сессии, при открытии нового сеанса в терминале было бы исчезли
Хариоо Шарипутру

Ответы:


104

Помимо того, /etc/profileчто уже упоминалось другими, некоторые системы Linux теперь используют каталог /etc/profile.d/; любые .shфайлы в нем будут получены от /etc/profile. Немного аккуратнее хранить в этих файлах элементы пользовательской среды, чем просто редактировать /etc/profile.


4
Что, если некоторые пользователи используют другую оболочку, например zsh?
Matthieu Napoli

70
это не глобально ... это ограничено оболочкой ... жаль, что это наиболее приемлемый ответ
ммм

1
zsh будет исходить из файлов .sh в /etc/profile.d/, вы можете увидеть его из / etc / zshrc @Matthieu Napoli
Bily

4
Скрипты не используются для пользователя ROOT.
Val


38

мужчина 8 pam_env

человек 5 pam_env.conf

Если все службы входа в систему используют PAM , и все службы входа в систему имеют session required pam_env.soсоответствующие /etc/pam.d/*файлы конфигурации, то для всех сеансов входа в систему будут установлены некоторые переменные среды, указанные в pam_envфайле конфигурации.

В большинстве современных дистрибутивов Linux все это есть по умолчанию - просто добавьте желаемые глобальные переменные среды в /etc/security/pam_env.conf.

Это работает независимо от оболочки пользователя, а также для графического входа в систему (если xdm / kdm / gdm / entry /… настроен таким образом).


1
+1 вам также необходимо перезагрузиться после добавления переменной в pam_env.conf, потому что мгновенно на лету $ echo $ имя переменной не отображается

9
Перезагружаться не нужно, нужно заново авторизоваться. (Мне не нужно перезагружать критически важные серверы)
Линдон Уайт

Похоже, это не относится к моему дистрибутиву Mint 17.2. Предустановленный файл полностью закомментирован, и если я добавлю что-то подобное echo foo>/home/me/barи перезагружусь (и снова зарегистрируюсь), этот файл не будет создан. (Вероятно, есть более элегантный способ проверить это, но я хотел убедиться, прежде чем комментировать здесь.)
Майкл Шепер

16

Удивительно, но в Unix и Linux на самом деле нет места для установки глобальных переменных среды. Лучшее, что вы можете сделать, - это организовать для любой конкретной оболочки инициализацию для конкретного сайта.

Если вы его /etc/profileвставите, это позаботится о большинстве пользователей posix-совместимой оболочки. Вероятно, этого «достаточно» для некритических целей.

Но никто с оболочкой cshили tcshне увидит его, и я не верю, что у cshнего есть глобальный файл инициализации.


8
/etc/environmentна самом деле, кажется, устанавливает переменные среды для меня, даже как пользователь root. Я знаю, что /etc/environmentэто на amazon linux и ubuntu. Мне не удалось проверить, работает ли csh, tcsh или zsh.
Джордан Стюарт

он не зависит от используемой вами оболочки, он действительно
глобален

9

Некоторые интересные выдержки из man-страницы bash:

Когда bash вызывается как интерактивная оболочка входа в систему или как неинтерактивная оболочка с --loginопцией, она сначала считывает и выполняет команды из файла /etc/profile, если этот файл существует. После прочтения этого файла, он ищет ~/.bash_profile, ~/.bash_loginи ~/.profile, в таком порядке, и читает и выполняет команду из первого, который существует и читаемые. Этот --noprofileпараметр можно использовать при запуске оболочки, чтобы запретить такое поведение.
...
Когда запускается интерактивная оболочка, которая не является оболочкой входа в систему, bash читает и выполняет команды из /etc/bash.bashrcи ~/.bashrc, если эти файлы существуют. Это можно запретить с помощью --norcопции. --rcfileПараметр файла заставит bash читать и выполнять команды из файла вместо /etc/bash.bashrcи ~/.bashrc.

Так что взгляните на /etc/profileили /etc/bash.bashrc, эти файлы - правильное место для глобальных настроек. Поместите в них что-то вроде этого, чтобы настроить переменную окружения:

export MY_VAR=xxx

Обратите внимание, что в классических системах Unix и оболочка Bourne, и оболочка Korn также читают / etc / profile - вероятно, это наиболее широко используемое место для настройки системной среды. Некоторые версии оболочки C смотрят в /etc/csh.cshrc и /etc/csh.login, а также в папки для каждого пользователя; другие не используют файлы настроек системной среды.
Джонатан Леффлер,

Потрясающе, именно то, что я искал, касательно установки env для пользователей оболочки, не входящей в систему.
Дэвид Манн

Извините, я, кажется, случайно отклонил это, когда какое-то время стрелки не были видны ... не могли бы вы отредактировать это (например, опечатка "environment" во второй предпоследней строке), чтобы я мог удалить отрицательный голос?
Бенджамин В.

4

Использование PAM отлично.

# modify the display PAM
$ cat /etc/security/pam_env.conf 
# BEFORE: $ export DISPLAY=:0.0 && python /var/tmp/myproject/click.py &
# AFTER : $ python $abc/click.py &
DISPLAY  DEFAULT=${REMOTEHOST}:0.0 OVERRIDE=${DISPLAY}
abc   DEFAULT=/var/tmp/myproject

2

Каждый процесс, работающий под управлением ядра Linux, получает свою собственную уникальную среду, которую он наследует от своего родителя. В этом случае родителем будет либо сама оболочка (порождающая вспомогательную оболочку), либо программа входа в систему (в типичной системе).

Поскольку среда каждого процесса защищена, нет возможности `` внедрить '' переменную среды в каждый запущенный процесс, поэтому даже если вы измените оболочку .rc / profile по умолчанию, она не вступит в силу, пока каждый процесс не выйдет и не перезагрузится. его начальные настройки.

Загляните в / etc /, чтобы изменить переменные запуска по умолчанию для любой конкретной оболочки. Просто поймите, что пользователи могут (и часто делают) изменять их в своих индивидуальных настройках.

Unix разработан, чтобы подчиняться пользователю в определенных пределах.

NB : Bash - не единственная оболочка в вашей системе. Обратите особое внимание на то, на что фактически указывает символическая ссылка / bin / sh. Во многих системах это может быть тире, что (по умолчанию, без специального вызова) ПРАВИЛЬНО. Поэтому вам следует позаботиться об изменении обоих значений по умолчанию, иначе сценарии, начинающиеся с / bin / sh, не будут наследовать ваши глобальные настройки по умолчанию. Точно так же старайтесь избегать синтаксиса, который понимает только bash при редактировании обоих, иначе говоря avoiding bashisms.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.