我可以在 systemd 的 EnvironmentFile 中设置多行环境变量吗?

Hub*_*bro 4 debian systemd

我需要为我的应用程序的邮件功能定义一个这样的环境变量才能工作:

RUBY_MAIL_SMTP_SETTINGS='
:address: "smtp.example.com"
:port: "25"
:authentication: :plain
:encryption: :tls
:user_name: "user"
:password: "pass"
'
Run Code Online (Sandbox Code Playgroud)

将其粘贴到 bash 终端可以正常工作,但将其放入环境文件并从带有该EnvironmentFile选项的 systemd 单元文件中引用它不起作用:

juli 01 07:17:58 myserver systemd[1]:忽略无效环境 'RUBY_MAIL_SMTP_SETTINGS=
juli 01 07:17:58 myserver systemd[1] ::地址:“smtp.example.com”
juli 01 07:17:58 myserver systemd[1]::端口:“25”
juli 01 07:17:58 myserver systemd[1]::authentication::plain
juli 01 07:17:58 myserver systemd[1]::encryption::tls
juli 01 07:17:58 myserver systemd[1]::user_name:“用户”
juli 01 07:17:58 myserver systemd[1]::password:"pass"':/usr/local/etc/myproject/environment

我试过在每一行后附加一个反斜杠,如下所示:

RUBY_MAIL_SMTP_SETTINGS='\
:address: "smtp.example.com"\
:port: "25"\
:authentication: :plain\
:encryption: :tls\
:user_name: "user"\
:password: "pass"
'
Run Code Online (Sandbox Code Playgroud)

这有效,但被解释为一长行,这意味着无法将内容解析为 YAML。

那么这是否意味着无法将多行环境变量添加到 systemd 环境文件中?

小智 5

您需要引用整个变量赋值(不是值)和反斜杠每一行。

示例服务文件:

[Service]
Environment='RUBY_MAIL_SMTP_SETTINGS=\
:address: "smtp.example.com"\
:port: "25"\
:authentication: :plain\
:encryption: :tls\
:user_name: "user"\
:password: "pass"\
'

ExecStart=/bin/echo $RUBY_MAIL_SMTP_SETTINGS
Run Code Online (Sandbox Code Playgroud)

运行此示例将生成日志:

Oct 27 14:03:32 io echo[9621]: :address: smtp.example.com :port: 25 :authentication: :plain :encryption: :tls :user_name: user :password: pass
Run Code Online (Sandbox Code Playgroud)

  • 唉,这个输出中有空格而不是换行符。任何需要通过 Systemd 传递标准公钥/私钥的人都将失去运气。 (2认同)