Виконайте одну команду для кожного неінтерактивного сеансу bash


4

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

З документації я розумію, що bash.bashrcі bash_profileназивається тільки для входу або інтерактивних оболонок. Чи є якийсь спосіб створити якісь подібні дзвінки для неінтерактивних оболонок?

Відповіді:


1

Щоб зробити 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 та менеджери дисплеїв, а також демони, такі як atd та cron. Якщо все працює так, як очікувалося, тоді ви зробите, і читати далі немає потреби.

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

    session       required   pam_env.so readenv=1

(Примітка. readenvПрапор, який вмикає чи вимикає читання файлу конфігурації, насправді не потрібен, оскільки він за замовчуванням встановлений увімкнено (1), але це також не завадить переконатися.)

Або: Якщо ви працюєте в системі, яка не забезпечує pam_env, то найкращою альтернативою, яка мені спадає на думку, було б написати простий скрипт init (або файл сервісного блоку в systemd), який аналізує спеціальний конфігураційний файл (наприклад /etc/default/environment) під час завантаження. .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.