
背景:我正在監獄(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 在路由時配置傳輸的目標。
筆記:以下答案無法解決分段錯誤問題,因此我不會將其標記為已接受。
此解決方案基於以下觀察:雖然如果由 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。)