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 在路由時配置傳輸的目標。
筆記:以下答案無法解決分段錯誤問題,因此我不會將其標記為已接受。

此解決方案基於以下觀察:雖然如果由 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。)

相關內容