5

Мне нужно реализовать некоторые настройки - мне нужно выполнить некоторый код, если кто-то в моей системе вызывает команду bash в любой форме (интерактивной, неинтерактивной и в форме bash -c ). Например, это команда, которую я хочу добавить к каждому вызову bash:
touch /tmp/$RANDOM
Я добавил эту строку в /bash/bash.bashrc и она отлично работает для оболочки входа в систему и для оболочек, которая была инициализирована вызовом команды bash .
Но это не будет работать для сеанса bash, инициализированного так:
bash -c 'echo 1' - новый файл не будет создан

Из документации я понимаю, что bash.bashrc и bash_profile вызывается только для входа в систему или интерактивных оболочек. Есть ли способ создать несколько похожих вызовов и для неинтерактивных оболочек?

1 ответ1

2

Чтобы заставить bash анализировать файл, когда он вызывается как неинтерактивная оболочка, вам нужно установить переменную среды BASH_ENV чтобы она указывала на этот файл. От man bash (раздел «ПРИЗНАНИЕ»):

Когда bash запускается неинтерактивно, например, для запуска сценария оболочки он ищет переменную BASH_ENV в среде, расширяет ее значение, если оно там появляется, и использует расширенное значение в качестве имени файла для чтения и выполнения. , Bash ведет себя так, как будто была выполнена следующая команда:

    if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

но значение переменной PATH не используется для поиска имени файла.

Так где же установить BASH_ENV?

Либо: если вы хотите, чтобы переменная была доступна для всей системы, лучше всего ее поместить в /etc/environment . Этот файл специально создан для общесистемных настроек переменных среды. Он анализируется не оболочкой, а модулем PAM pam_env , поэтому вы не можете использовать синтаксис оболочки или расширение переменных внутри, а только простые присваивания следующего типа:

    VARIABLE=value

или же

    VARIABLE=/full/path/to/file

Изменения вступят в силу при следующем входе в систему / аутентификации, поэтому переключитесь на новую консоль tty или выйдите из системы и повторно войдите в свой сеанс.

В стандартной настольной системе это должно работать для всех типов аутентифицированных сеансов, использующих PAM, включая консольные логины, диспетчеры ssh и display, а также демоны, такие как atd и cron. Если все работает как положено, значит, все готово, и вам не нужно читать дальше.

Однако ошибки иногда проникают в файлы конфигурации PAM некоторых программ / дистрибутивов, поэтому, если /etc/environment не анализируется программой определенного типа, убедитесь, что необходимый модуль PAM загружен в файл конфигурации PAM для этой программы. в /etc/pam.d:

    session       required   pam_env.so readenv=1

(Примечание: флаг readenv который включает / выключает чтение файла конфигурации, на самом деле не должен быть необходим, поскольку по умолчанию он включен (1), но это также не мешает убедиться).

Или: если вы работаете в системе, которая не предоставляет pam_env , то лучшей альтернативой, которая мне приходит в голову, будет написание простого сценария инициализации (или файла служебного блока в systemd), который анализирует пользовательский файл конфигурации (такой как /etc/default/environment) при загрузке.

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