我已经编写了一个 systemd 文件来使用特定的配置文件启动我的 VPN 服务。我希望能够做的是在每次服务启动时将此文件替换为随机选择的配置文件。
到目前为止,我已经尝试使用
ExecStartPre=cp -f `ls /etc/openvpn/ovpn_udp/au* | shuf -n 1` /etc/openvpn/%i.conf
将随机选取的文件复制到指定的配置文件。我尝试过的一些替代方法是
- 使用 rsync -c 而不是 cp
- 整个 ExecStartPre 命令周围的双引号
- 逃避`
最后我还尝试了以下 ExecStart 来
ExecStart=/usr/sbin/openvpn --config `ls /etc/openvpn/ovpn_udp/au* | shuf -n 1`
都没有效果。
目前systemd文件如下
[Unit]
Description=OpenVPN Robust And Highly Flexible Tunneling Application On %I
After=network.target
[Service]
Type=notify
PrivateTmp=true
ExecStartPre=cp -f `ls /etc/openvpn/ovpn_udp/au* | shuf -n 1` /etc/openvpn/%i.conf
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/%i.conf
[Install]
WantedBy=multi-user.target
我希望在每次启动服务之前更改配置文件,但到目前为止我没有看到任何错误或配置文件被替换。
任何帮助将不胜感激。
谢谢
ExecStart= 命令不是由 shell 运行的,也不提供通常的 shell 语言功能。它唯一拥有的是引用和 $variable 替换——但它没有竖线或“反引号”或 $(命令替换)。
为了使用这些功能,a) 显式运行一个 shell,如 /bin/sh:
或 b) 将您的命令移动到 shell 脚本中并从 ExecStart=运行它。
请注意,OpenVPN 本身已经支持在同一配置中声明多个服务器,使用
<connection>
块和--remote-random
,如其手册页所示:感谢@grawity,它解决了很多问题。利用您的回答,我现在已经成功地将我的 systemd 服务文件修改为下面的内容,这正是我需要的。