背景:私は刑務所(FreeNAS 11.1プラグイン刑務所)でTransmission(v2.93)とOpenVPN(v2.4.6)を設定しており、プログラムを--up
使用してTransmissionのリスニングポートを変更するように要求するスクリプトを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
、スクリプト自体実行されましたが、実際のコマンドが奇妙に失敗しました。ポートが割り当てられていません(次を見て確認)。リモートグラフィカルユーザーインターフェース転送そして、このコマンドは空の出力を生成します。
デバッグファイルの内容は次のとおりです。空
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-remote
このソリューションは、OpenVPNで呼び出すとセグフォルトが発生しますが、代わりに呼び出すと完全に実行されるという観察に基づいています。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
上記のスクリプトを1分ごとに呼び出すように設定してください。私は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)。