SSHによるsh起動ファイル

SSHによるsh起動ファイル

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_keysenvironment="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

おすすめ記事