Rsyncを使用して、あるコンピューターから別のコンピューターにファイルをコピーすると、rsyncプロセスが両端で開始されます。ただし、リモートエンドでは、シェル初期化ファイルが読み取られないようであるため、リモートrsyncプロセスの環境変数を設定できません。残念ながら、rsyncが機能するために環境変数を必要とするrsyncが必要なサーバーが1つあります。私はサーバーの管理者ではないため、グローバル構成を変更できません。リモートrsyncプロセスの環境変数を設定するにはどうすればよいですか?
~/.profile
は、対話型sshセッション(または対話型セッションを開始する他のログイン方法)とは対照的に、通常、ssh somecommand
を実行するときに読み取られません。
Sshは環境変数の送信をサポートしています。 OpenSSHでは、 ~/.ssh/config
でSendEnv
ディレクティブを使用します。ただし、特定の環境変数は、 サーバー構成 の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