systemd, EnvironmentFile, повторное использование переменных - как?

Подстановка процесса создает трубу, использует /dev/fd для указания пути, эквивалентного дескриптору файла, в котором находится труба, и передает имя файла в качестве аргумента программе. Здесь программа - sudo, и она передает этот аргумент (который является просто строкой, насколько это возможно) программе wpa_supplicant, которая рассматривает его как имя файла.

Проблема в том, что sudo закрывает все дескрипторы файлов, кроме стандартных (stdin=0, stdout=1 и stderr=2). Труба подстановки процесса находится на другом дескрипторе, который закрывается, поэтому когда wpa_supplicant пытается открыть его, он находит несуществующий файл.

Если ваша политика sudo позволяет это (включена опция closefrom_override), вы можете запретить закрывать файловые дескрипторы. Но обычно это не так.

sudo -C 64 wpa_supplicant … -c <(wpa_passphrase …)

В качестве альтернативы, поскольку вы не используете стандартный ввод, передайте данные туда.

wpa_passphrase … | sudo wpa_supplicant … -c /dev/stdin

Или же запустите shell из sudo и поместите туда подстановку процесса. Будьте осторожны с кавычками, если команда содержит специальные символы.

sudo bash -c 'wpa_supplication … -c <(wpa_passphrase …)'

6
15.04.2017, 01:24
5 ответов

К сожалению, этот файл, который у вас есть, на самом деле является сценарием оболочки. В прошлом большинство систем / сценариев инициализации интерпретировали файлы, которые предоставляют переменные среды, используя оболочку, так что вы могли уйти от работы с оболочкой в ​​них. Однако Systemd этого не делает. Файл среды - это действительно файл среды, а не скрипт. Это описано в systemd.exec странице руководства :

Расширение переменной не выполняется внутри строк, однако расширение спецификатора возможно.Символ $ не имеет особого значения.

Следовательно, у вас есть 2 варианта.

  1. Раскройте все свои переменные вручную. Значение использования CATALINA_BASE = / d01 / tomcat / prod / xyz / 1 .

  2. Оцените файл с помощью оболочки:
    ExecStart = / bin / bash -ac '. / путь / к / env_file; exec / path / to / program '

12
29.04.2021, 00:02

Нужно ли сделать одно длинное трудночитаемое заявление?

Нет

Строка, заканчивающаяся обратной косой чертой, будет объединена со следующей, что позволит определять многострочные переменные.

3
29.04.2021, 00:02

Вы можете использовать bash для расширения ваших переменных.

Файл среды:

BLA=bla
BLABLA=${BLA}${BLA}

Используйте bash -c для выполнения команды:

ExecStart=/usr/bin/bash -c 'echo ${BLA} .. ${BLABLA}'

Вывод:

bash[4771]: bla .. blabla
2
29.04.2021, 00:02

В конкретном случае Tomcat (, как и в этом вопросе ), я обнаружил, что проще поместить большинство этих настроек в bin/setenv.sh, который выполняется Tomcat при запуске и оценивает переменные в сценарий оболочки, как и ожидалось.

Итак, в /etc/systemd/system/tomcat.serviceя указываю переменные Environmentтолько для CATALINA_BASEи CATALINA_HOME, а затем помещаю все остальное в ${CATALINA_BASE}/bin/setenv.sh.

1
29.04.2021, 00:02

Другой вариант :Иметь дополнительный модуль, который запускается перед этим и создает EnvironmentFile, который он может использовать:https://stackoverflow.com/a/42841480/32453

Второстепенное устройство может, например, использовать bash. Кажется, это systemdспособ импорта env. :|

0
29.04.2021, 00:02

Теги

Похожие вопросы