shシェルが起動する前に、いくつかの重要なコマンドを実行する必要があります。これはssh host somecommand
、SSHコマンド()およびコマンドを実行する他のプログラム内でSSHコマンドを渡すために必要です。
私の中には.profile
これがあります:
ihammerhands@wreckcreations:~> cat .profile
#specific environment and startup programs
export PS1="\u@wreckcreations:\w> "
export PYTHONPATH=~/python/lib/python2.4/site-packages
export PATH=$PATH:~/bin:~/python/bin
しかし、これは失敗します。
W:\programming\wreckcreations-site\test-hg>ssh name@host echo $PATH
Enter passphrase for key '/home/Owner/.ssh/id_rsa':
/usr/local/bin:/bin:/usr/bin
欠落しているPATHオプションに注意してください。
sh設定ファイルの正確な名前は何ですか?注:私はrootアクセス権を持っておらず、これを他のユーザーに適用したくありません。別の方法がありますか?
/bin/sh
編集:に接続されているようですbash
。これは驚くべきことではありません。驚いたことに、私のプロフィールはまだ無視されます。どんな提案がありますか?
ベストアンサー1
~/.profile
ログインシェルによってのみ実行されます。シェルを呼び出すプログラムは、シェルがログインシェルかどうかを判断します(シェル-
呼び出しで0番目の引数の最初の文字としてaを渡します)。特定のコマンドを実行するためにログインすると、通常コマンドは実行されません。
具体的には、OpenSSH はコマンドを指定しなかった場合にのみログインシェルを呼び出します。したがって、コマンドを指定すると~/.profile
読み込まれません。
OpenSSH では、サーバー側で環境変数を設定できます。この機能は以下で有効にする必要があります。サーバー構成、PermitUserEnvironment
指示が含まれています。変数はファイルで設定できます。~/.ssh/environment
。公開鍵認証を使用していると仮定すると、次の各キー変数を設定することもできます。~/.ssh/authorized_keys
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の場合。--rsync-path='bin/rsync'
rsync
--rsync-path='. ~/.profile; 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