web-dev-qa-db-ja.com

リモートrsyncプロセスの環境変数を設定するにはどうすればよいですか?

Rsyncを使用して、あるコンピューターから別のコンピューターにファイルをコピーすると、rsyncプロセスが両端で開始されます。ただし、リモートエンドでは、シェル初期化ファイルが読み取られないようであるため、リモートrsyncプロセスの環境変数を設定できません。残念ながら、rsyncが機能するために環境変数を必要とするrsyncが必要なサーバーが1つあります。私はサーバーの管理者ではないため、グローバル構成を変更できません。リモートrsyncプロセスの環境変数を設定するにはどうすればよいですか?

12

~/.profileは、対話型sshセッション(または対話型セッションを開始する他のログイン方法)とは対照的に、通常、ssh somecommandを実行するときに読み取られません。

Sshは環境変数の送信をサポートしています。 OpenSSHでは、 ~/.ssh/configSendEnvディレクティブを使用します。ただし、特定の環境変数は、 サーバー構成AcceptEnvディレクティブで有効にする必要があるため、これではうまくいかない場合があります。

OpenSSHでは、サーバー側で環境変数を設定することもできます。繰り返しますが、これはサーバー構成で有効にする必要があります。ここではPermitUserEnvironmentディレクティブを使用します。変数はファイル ~/.ssh/environment で設定できます。公開鍵認証を使用していると仮定すると、キーごとの変数を ~/.ssh/authorized_keys に設定することもできます。関連する行の先頭にenvironment="FOO=bar"を追加します。

公開鍵認証を使用している限り、(奇妙なことに)常に機能すると思うことの1つは、(ab)command=オプションを使用することです。 -)authorized_keysファイル内。 commandオプションのあるキーは、指定されたコマンドを実行する場合にのみ有効です。ただし、authorized_keysファイル内のコマンドは、環境変数SSH_ORIGINAL_COMMANDをユーザーが指定したコマンドに設定して実行されます(対話型セッションの場合は空)。したがって、~/.ssh/authorized_keysで次のようなものを使用できます(もちろん、認証にこのキーを使用しない場合は適用されません):

command="export LD_LIBRARY_PATH=\"$HOME\"/lib;
         if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
           eval \"$SSH_ORIGINAL_COMMAND\";
         else exec \"$Shell\"; fi" ssh-rsa …

読みやすくするために上に改行を入れましたが、実際にはすべて1行にする必要があることに注意してください。

もう1つの可能性は、サーバー上にラッパースクリプト~/bin/rsync-wrapperを作成することです。

#!/bin/sh
. ~/.profile
exec rsync "$@"

次に、rsyncコマンドラインで--rsync-path='bin/rsync-wrapper'を渡します。 --rsync-pathの引数はシェルによって展開されるため、必要に応じて、--rsync-path='. ~/.profile; rsync'のようなものを渡すことでrsyncコマンドラインを自己完結型にすることができます。

ログインシェルがbashまたはzshであることに依存する別の方法があります。 Bashは、rshdまたはsshdによって呼び出されると、対話型でなくても常に~/.bashrcを読み取ります(ただし、shとして呼び出された場合はそうではありません)。 Zshは常に~/.zshenvを読み取ります。

## ~/.bashrc
if [[ $- != *i* ]]; then
  # Either .bashrc was sourced explicitly, or this is an rsh/ssh session.
  . ~/.profile
fi

## ~/.zshenv
if [[ $(ps -p $PPID -o comm=) = [rs]shd && $- != *l* ]]; then
  # Not a login Shell, but this is an rsh/ssh session
  . ~/.profile
fi