如何转义systemd中的特殊字符以传递给ExecStart命令

9

我写了以下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

tcpdump允许使用类似于%H表示小时,%M表示分钟等的strftime占位符,以便您创建时间戳文件。

但是,systemd具有特殊的指示符(如%n,%N,%p,%i,%U,%u,%m,%H,%b,%v),因此任何重叠的指示符(如%m和%H)都会通过systemd传递信息,并且不允许传递占位符到tcpdump以创建时间戳。

有没有人知道是否有一种方法可以在systemd中转义指示符,以便我可以将%m和%H传递给tcpdump?

2个回答

11

我已经尝试过像 %%m\%m 这样的特殊符号进行转义,但没有成功。

但是,如果你需要完成这项工作,这里有一个解决方法:

创建名为 tcpdumpd.environment 的文件,其中包含 TCPDUMP_FORMAT 变量的定义。

TCPDUMP_FORMAT=%Y-%m-%d_%H:%M:%S

修改 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

这是答案。在 这个答案 中找到了能帮我解决问题的确切方法。谢谢! - Ben Sooter
1
systemd 版本 215 中,您可以使用 Environment="TCPDUMP_FORMAT=%%Y-%%m-%%d_%%H:%%M:%%S" 代替 EnvironmentFile - Iskren

6

有没有人知道在systemd中是否有一种方法可以转义格式说明符,以便我可以将%m和%H传递给tcpdump?

是的:%%m%%H

请参见man systemd.unit

"%%" | 单个百分号 | 使用"%%"代替"%"来指定一个百分号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接