~/.profile
ログインシェルによってのみ実行されます。シェルを呼び出すプログラムは、シェルがログインシェルになるかどうかを決定します(-
シェル呼び出しの0番目の引数の最初の文字としてa を置くことにより)。通常、ログインして特定のコマンドを実行するときには実行されません。
特にOpenSSHは、コマンドを指定しない場合にのみログインシェルを呼び出します。したがって、コマンドを指定して~/.profile
も、読み取られません。
OpenSSHでは、サーバー側で環境変数を設定できます。これは、ディレクティブを使用して、サーバー構成で有効にする必要がありますPermitUserEnvironment
。変数はファイルで設定できます~/.ssh/environment
。公開鍵認証を使用すると仮定すると、関連する行の先頭に~/.ssh/authorized_keys
:add environment="FOO=bar"
で鍵ごとの変数を設定することもできます。
SSHは、環境変数の送信もサポートしています。OpenSSHでは、のSendEnv
ディレクティブを使用し~/.ssh/config
ます。ただし、AcceptEnv
サーバー構成のディレクティブで特定の環境変数を有効にする必要があるため、これがうまく機能しない場合があります。
公開鍵認証を使用している限り、常に(奇妙なことに)機能すると私が思う1つのことは、ファイル内のオプションを(ab)使用するcommand=
ことauthorized_keys
です。command
オプション付きのキーは、指定されたコマンドの実行にのみ適しています。ただし、authorized_keys
ファイル内SSH_ORIGINAL_COMMAND
のコマンドは、ユーザーが指定したコマンドに設定された環境変数で実行されます。この変数は、ユーザーがコマンドを指定しなかったためにインタラクティブシェルが必要な場合は空になります。したがって、次のようなものを使用できます~/.ssh/authorized_keys
(もちろん、認証にこのキーを使用しない場合は適用されません)。
command=". ~/.profile; if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then eval \"$SSH_ORIGINAL_COMMAND\"; else exec \"$SHELL\"; fi" ssh-rsa …
別の可能性は、サーバー上にラッパースクリプトを記述することです。の次のようなもの~/bin/ssh-wrapper
:
#!/bin/sh
. ~/.profile
exec "${0##*/}" "$@"
そして、と呼ばれるこのスクリプトへのシンボリックリンクを作るrsync
、unison
など峠、--rsync-path='bin/rsync'
上のrsync
他のプログラムのためのコマンドラインなど。または、一部のコマンドでは、リモートで実行するシェルスニペット全体を指定できます。これにより、コマンドを自己完結型にすることができます--rsync-path='. ~/.profile; rsync'
。たとえば、rsyncでは、を使用できます。
ログインシェルがbashまたはzshであることに依存する別の方法があります。bashは~/.bashrc
、対話型ではない場合でも(rshdまたはsshdによって呼び出された場合は常に読み取ります(ただし、として呼び出された場合は読み取りません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