rsyncサーバーにカスタムパラメータを送信する方法はありますか?

rsyncサーバーにカスタムパラメータを送信する方法はありますか?

クライアント用のバックアップサーバーがあります同期SSH経由。サーバーは、rsync サーバー側呼び出しをラップするカスタムシェルスクリプトを実行するように構成されます。クライアントはこれを認識せず、有効なrsyncコマンドラインを実行できます。

クライアントのいくつかのパラメータをこのシェルスクリプトに渡したいと思います。それはまるで

$ rsync -av -customarg1 value1 -customarg2 value2 file1 file2 user@server

クライアントは(pass)rsyncのように、自分が知らないパラメータを拒否します。私が考えた最善の方法は、rsyncサーバーを起動するためにスクリプトを実行する前に、スクリプトがサーバー側のコマンドラインから抽出する偽のサーバー側のファイル仕様に引数を渡すことです。つまり、このようなコマンドsshrsync -e

$ rsync -av file1 file2 user@server:some/path\;customarg1=value1\;customarg2=value2

2つのパラメータを指定し、コマンドのように動作します。

$ rsync -av file1 file2 user@server:some/path

(これは、SSHサーバーが実行するように構成された内容(カスタムシェルスクリプトなど)に関係なく、SSHを使用してsshクライアントによって実行されたコマンド(rsyncクライアントによって実行されたrsyncサーバーコマンドなど)を含む複数の環境変数を設定する$SSH_ORIGINAL_COMMANDします。

答え1

-Mおそらくオプション(長いバージョン)が利用可能ですが、--remote-optionクライアント側のrsyncはそのオプションをチェックしないようです。-M-xxxxリモコンに転送され、-Mで削除されます-xxxx。この機能は簡単に使用でき、-M-M-xxxxクライアントとリモートでは無視されます。

rsync -av -M-M-myvar=val /tmp/test/ remote:test/

rsync を呼び出す前に、サーバーのフロントエンドが結果フラグを認識して削除すると、必要なものが得られます。

--rsync-pathさらに、これを使用してすべてのスクリプトを実行できます。リモートパラメータを接続します。例えば

rsync -a -M-myvar=val --rsync-path='echo hello >/tmp/out; ./mysync' /tmp/test/ remote:test/

リモートで次のことを実行します

echo hello >/tmp/out
./mysync --server -logDtpre.iLsfx -myvar=val . test/

答え2

あまりきれいではありませんが、スクリプトにすべて隠すことができます。

SSH はトンネルを介して任意の環境変数を送信できます。クライアントとサーバーの両方を許可するように構成する必要があります。このオプションはクライアントで簡単に実行でき、ファイル内のサーバーで実行する-o必要があります。sshd_configランダムなものを受け入れるのは良い考えではありませんが、次のように動作するはずです。

BACKUP_PROVIDER_VAR1=val1 rsync -e 'ssh -o SendEnv=BACKUP_PROVIDER_*' …

AcceptEnv LANG LC_* BACKUP_PROVIDER_*その後、1つを追加する必要がありますsshd_config(私が理解したところ、これはMatchブロックを持つ特定のユーザー/グループに制限される可能性があります)。現実的には、バックアップクライアントLANGLC_*バックアップクライアントは不要なので、ユーザー定義の環境変数だけが必要です。

答え3

rsyncバージョン3.1.0以降、パラメータ--remote-option(またはその略語-M)を使用してパラメータをサーバーに渡すことができます。たとえば、クライアントに対して次のコマンドを実行します。

$ rsync -av -M --customarg1=value1 -M --customarg2=value2 file1 file2 user@server:some/path

サーバーコマンドは、プレフィックスがあるが-M含まれていない変数の引数を受け取ります。このように:-MSSH_ORIGINAL_COMMAND

rsync --server -vnlogDtpre.iLsfxC --customarg1=value1 --customarg2=value1 . some/path

サーバー側のrsyncを呼び出す前に、カスタムパラメータを処理してコマンドラインから削除する必要があります(そうしないと、パラメータが認識されないためエラーで終了します)。 1つの方法は正規表現マッチングを使用することです。

rsync_cmd="$SSH_ORIGINAL_COMMAND"
[[ "$rsync_cmd" =~ --customarg1=([a-zA-Z0-9]+) ]] && customarg1=${BASH_REMATCH[1]}
[[ "$rsync_cmd" =~ --customarg2=([a-zA-Z0-9]+) ]] && customarg2=${BASH_REMATCH[1]}
rsync_cmd=$(sed -re 's/--(customarg1|customarg2)=[a-zA-Z0-9]+//g' <<< $rsync_cmd)

(例正規表現一致では、パラメータは英数字である可能性があります)

-sこれに対する1つの注意点は、(または)オプションがrsyncクライアントに提供されている場合は効果がないことです。--protect-argsこれは、パラメータがrsyncクライアントとサーバー間で内部的に渡されるためです。これらのパラメータはシェルに公開されず、含まれていません。$SSH_ORIGINAL_COMMANDそのため操作できません。

--rsync-path別の方法は、カスタムパラメータ渡しを使用することです。この方法は、次のオプションがない古いバージョンの-Mrsyncで動作します--protect-args

$ rsync --rsync-path='rsync --customarg1=value1 --customarg2=value2' -av file1 file2 user@server:some/path

関連情報