OpenVPN 起動スクリプトはコマンドを実行しません

OpenVPN 起動スクリプトはコマンドを実行しません

背景: Transmission (v2.93) と OpenVPN (v2.4.6) を jail (FreeNAS 11.1 プラグイン jail) で設定しており、--upTransmission にリスニング ポートの変更を要求するスクリプトを OpenVPN に追加したいと考えています (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) を起動すると、スクリプト自体実行されたが、実際のコマンドは不思議なことに失敗している。ポートが割り当てられていない(トランスミッションリモートGUIコマンドは空の出力を生成します。
デバッグファイルの内容は次のとおりです。
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 を構成するという目標を達成するために、この問題を回避することができました。
注記: 次の回答はセグメンテーション違反の問題を解決しないため、これを承認済みとしてマークしません。

解決策は、次の観察に基づいています: transmission-remoteOpenVPN によって呼び出された場合はセグメント違反が発生しますが、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

レベルを3~4に設定するとverb、スクリプトが実行されないという警告が表示されるはずです。デフォルトでは、OpenVPN 2.2以降は特定の組み込み関数のみを呼び出します。これを緩和するには、script-security:

--script-security level

このディレクティブは、OpenVPN の外部プログラムとスクリプトの使用に対するポリシー レベルの制御を提供します。レベルが低いほど制限が厳しくなり、レベルが高いほど許容範囲が広くなります。

レベルの設定:

0-- 外部プログラムの呼び出しは厳密に禁止します。
1-- (デフォルト) ifconfig、ip、route、netsh などの組み込み実行可能ファイルのみを呼び出します。
2-- 組み込み実行可能ファイルとユーザー定義スクリプトの呼び出しを許可します。
3-- 環境変数を介してスクリプトにパスワードを渡すことを許可します (安全でない可能性があります)。

2 または 3 に設定されていることを確認する必要がありますscript-security(スクリプトにパスワードを送信する必要がない場合は 2、それ以外の場合は 3)。

関連情報