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

133

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

TIMEX
источник
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 /… настроен таким образом).

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

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

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

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

DigitalRoss
источник
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.

Тим Пост
источник