如何转义systemd Specifier以传递给ExecStart中的命令

Ben*_*ter 2 tcpdump systemd

我编写了以下systemd服务tcpdumpd.service来启动持久的tcpdump录制.

[Unit]
Description=TCPDumpd
After=multi-user.target network.target

[Service]
Type=simple
ExecStart=/usr/sbin/tcpdump -pni eth0 -s65535 -G 3600 -w '/var/log/tcpdump/trace_%Y-%m-%d_%H:%M:%S.pcap' -z gzip
Restart=on-abort

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

tcpdump允许strftime-placeholder如%H表示小时,%M表示分钟等等,允许您创建带时间戳的文件.

但是,systemd具有可以在其中使用的特殊说明符,例如(%n,%N,%p,%i,%U,%u,%m,%H,%b,%v)所以任何说明符重叠,如%m和%H传递来自systemd的信息,并且不允许占位符传递给tcpdump来制作时间戳.

有谁知道是否有办法逃脱systemd中的说明符所以我可以将%m和%H传递给tcpdump?

Hei*_*ann 6

有谁知道是否有办法转义 systemd 中的说明符,以便我可以将 %m 和 %H 传递给 tcpdump?

是的:%%m%%H

请参阅man systemd.unit

“%%” | 单个百分号 | 使用“%%”代替“%”来指定单个百分号。


ale*_*der 5

我试图逃避特殊的指定者%%m,\%m如果没有运气.

但是,如果您需要完成工作,这里有解决方法:

创建tcpdumpd.environment包含TCPDUMP_FORMAT变量定义的文件.

TCPDUMP_FORMAT=%Y-%m-%d_%H:%M:%S
Run Code Online (Sandbox Code Playgroud)

修改tcpdumpd.service:EnvironmentFile=为其添加选项并将格式字符串替换为${TCPDUMP_FORMAT}.

[Unit]
Description=TCPDumpd
After=multi-user.target network.target

[Service]
Type=simple
EnvironmentFile=tcpdumpd.environment
ExecStart=/usr/sbin/tcpdump -pni eth0 -s65535 -G 3600 -w '/var/log/tcpdump/trace_${TCPDUMP_FORMAT}.pcap' -z gzip
Restart=on-abort

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)