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

时间:2016-11-10 16:28:20

标签: 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

tcpdump允许使用strftime-place holder(例如%H表示小时,%M表示分钟等)以允许您创建带时间戳的文件。

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

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

2 个答案:

答案 0 :(得分:5)

我试图在没有运气的情况下逃避%%m\%m等特殊说明符。

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

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

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

答案 1 :(得分:0)

  

有人知道在systemd中是否有一种方法可以逃脱说明符,以便我可以将%m和%H传递给tcpdump吗?

是:%%m%%H

请参见man systemd.unit

  

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