OpenVPN 启动脚本不执行命令

OpenVPN 启动脚本不执行命令

背景:我正在监狱(FreeNAS 11.1 插件监狱)中配置 Transmission (v2.93) 和 OpenVPN (v2.4.6),并希望--up向 OpenVPN 添加一个脚本,该脚本将请求 Transmission 更改其侦听端口(使用transmission-remote程序)。

我的openvpn.conf包含以下内容(除其他外):

verb 4
script-security 2
up /usr/local/etc/openvpn/set_port.sh
up-restart ;only to make the up script be executed on restarts
           ;but disabling this changes nothing

并且set_port.sh脚本包含(仍然重现行为的最小脚本):

#!/usr/local/bin/bash
/usr/local/bin/transmission-remote --auth rpc_user:rpc_pass -p 6666 2>&1 > output.txt
echo 'the script itself runs: '$(pwd) $(whoami) > status.txt

脚本具有所有权限 (777),二进制文件 ( transmission-remote) 具有所有权限。我知道二进制路径实际上是一个软链接,因此我将其替换为实际路径 ( /usr/pbi/transmission-amd64/.sbin/transmission-remote),但我观察到的行为是相同的。

问题:当我启动 OpenVPN ( service openvpn start) 时,脚本本身已执行,但实际命令神秘失败:端口未分配(通过查看验证传输远程图形用户界面并且该命令生成空输出。
调试文件的内容如下:
output.txt为空(有或没有标准错误重定向)
status.txt按预期说:the script itself runs: /usr/local/etc/openvpn root

但是,当我手动运行此脚本(./set_port.sh)时,该命令成功完成:output.txt会说localhost:9091/transmission/rpc/ responded: "success"并且端口将被更改。

我缺少什么?

相似的这个问题,除了我没有收到任何“权限被拒绝”消息 - 似乎该命令甚至没有执行(如果我echo $(<that command>) > file.txt,我得到一个空文件)。
这个也有些相关,但OP正在询问--client-connect并最终通过编写他们想要运行的程序的完整路径来解决问题 - 这对我的情况没有帮助(但如果我echo $(ls /usr/local/bin) > log.txt,二进制文件列表是正确的)。

更新根据@roaima 的请求。我将其更改set_port.sh为以下内容:

#!/usr/local/bin/bash
exec >debug.txt 2>&1
set -x
echo script is running
/usr/pbi/transmission-amd64/.sbin/transmission-remote  --auth rpc_user:rpc_pass -p 6666 2>&1 > output.txt

然后冲洗并重复。该debug.txt文件包含以下几行:

+ echo script is running
script is running
+ /usr/pbi/transmission-amd64/.sbin/transmission-remote --auth rpc_user:rpc_pass -p 12345
/usr/local/etc/openvpn/test.sh: line 5:  6795 Segmentation fault      /usr/pbi/transmission-amd64/.sbin/transmission-remote --auth rpc_user:rpc_pass -p 12345 2>&1 > output.txt

答案1

看着线

/usr/local/etc/openvpn/test.sh: line 5:  6795 Segmentation fault      /usr/pbi/transmission-amd64/.sbin/transmission-remote --auth rpc_user:rpc_pass -p 12345 2>&1 > output.txt

看起来您的可执行文件的库不匹配。请重新检查您是如何构建 chroot 的。 (我已经很多年没有使用 FreeBSD 了,所以我无法给你指导如何做到这一点,抱歉。)

答案2

我不知道这里发生的库不匹配问题,尤其是这一切都发生在 FreeNAS“插件监狱”中,我不知道它是如何配置的。但是,我设法解决了这个问题,以实现让 OpenVPN 在路由启动时配置 Transmission 的目标。
笔记:以下答案不能解决分段错误问题,因此我不会将其标记为已接受。

该解决方案基于以下观察:虽然如果由 OpenVPN 调用会发生段错误,但如果改为调用它,则transmission-remote运行得非常好:cron

  1. 保持openvpn.conf原样。

  2. 在 中set_port.sh,不要调用 ,而是transmission-remote将端口号存储在文件中 - 例如这样:(echo $port > $path/port-id从这里开始,我将假设变量path通向我们存储脚本等的文件夹。)

  3. 创建一个新脚本,我们将其命名为actually_set.sh,其中包含以下内容:

#!/usr/local/bin/bash
if [ -f $path/port-id ]; then
  port=$(cat $path/port-id)
  rm $path/port-id
  transmission-remote -n 'rpc_user:rpc_pass' -p $port
fi
  1. 设置cron每分钟调用上面的脚本。我将以下内容放入我的 crontab 中:
    * * * * * /usr/local/etc/openvpn/ports/tp_setter.sh

答案3

如果你设置你的verb级别设置为 3-4,您可能应该看到有关脚本未运行的警告。默认情况下,OpenVPN 2.2+ 仅调用某些内置程序。你需要放松这个使用script-security:

--script-security level

该指令对 OpenVPN 对外部程序和脚本的使用提供策略级控制。较低级别的值更具限制性,较高的值更宽松。

等级设置:

0-- 严格禁止调用外部程序。
1--(默认)仅调用内置可执行文件,例如 ifconfig、ip、route 或 netsh。
2-- 允许调用内置可执行文件和用户定义的脚本。
3-- 允许通过环境变量将密码传递给脚本(可能不安全)。

您需要确保已script-security设置为 2 或 3(如果不需要向脚本发送密码则为 2,否则为 3。)

相关内容