クライアント用のバックアップサーバーがあります同期SSH経由。サーバーは、rsync サーバー側呼び出しをラップするカスタムシェルスクリプトを実行するように構成されます。クライアントはこれを認識せず、有効なrsyncコマンドラインを実行できます。
クライアントのいくつかのパラメータをこのシェルスクリプトに渡したいと思います。それはまるで
$ rsync -av -customarg1 value1 -customarg2 value2 file1 file2 user@server
クライアントは(pass)rsync
のように、自分が知らないパラメータを拒否します。私が考えた最善の方法は、rsyncサーバーを起動するためにスクリプトを実行する前に、スクリプトがサーバー側のコマンドラインから抽出する偽のサーバー側のファイル仕様に引数を渡すことです。つまり、このようなコマンドssh
rsync -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
ブロックを持つ特定のユーザー/グループに制限される可能性があります)。現実的には、バックアップクライアントLANG
やLC_*
バックアップクライアントは不要なので、ユーザー定義の環境変数だけが必要です。
答え3
rsyncバージョン3.1.0以降、パラメータ--remote-option
(またはその略語-M
)を使用してパラメータをサーバーに渡すことができます。たとえば、クライアントに対して次のコマンドを実行します。
$ rsync -av -M --customarg1=value1 -M --customarg2=value2 file1 file2 user@server:some/path
サーバーコマンドは、プレフィックスがあるが-M
含まれていない変数の引数を受け取ります。このように:-M
SSH_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
別の方法は、カスタムパラメータ渡しを使用することです。この方法は、次のオプションがない古いバージョンの-M
rsyncで動作します--protect-args
。
$ rsync --rsync-path='rsync --customarg1=value1 --customarg2=value2' -av file1 file2 user@server:some/path