背景:我正在监狱(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
保持
openvpn.conf
原样。在 中
set_port.sh
,不要调用 ,而是transmission-remote
将端口号存储在文件中 - 例如这样:(echo $port > $path/port-id
从这里开始,我将假设变量path
通向我们存储脚本等的文件夹。)创建一个新脚本,我们将其命名为
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
- 设置
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。)