Shシェルを開始する前に実行する必要があるいくつかの重要なコマンドがあります。これは、SSHコマンドでSSHコマンドを渡すために必要です(ssh Host somecommand
)およびコマンドを実行する他のプログラム。
私の.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
にリンクしていますが、これは当然のことです。驚いたのは、私のプロフィールがまだ無視されていることです。助言がありますか?
質問の中で言及したコマンドは、
ssh name@Host echo $PATH
ほとんど役に立ちません。 $ PATHの変数置換はローカルシェルによって行われ、リモートシステムでエコーを実行するsshに渡され、ローカルシステムで展開されたパス変数の内容が出力されます。これが、ネットワーク上のMacとLinuxマシンの間で同様のことをしている例です。
LibMBP:~ will$ echo $PATH
/opt/local/bin:/opt/local/sbin:/Users/will/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/texbin:/usr/X11/bin
LibMBP:~ will$ ssh warren echo $PATH
will@warren's password:
/opt/local/bin:/opt/local/sbin:/Users/will/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/texbin:/usr/X11/bin
LibMBP:~ will$ ssh warren 'echo $PATH'
will@warren's password:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
LibMBP:~ will$
ローカルシェルが変数を展開しないように引用符を使用する必要があることに注意してください。
~/.profile
は、ログインシェルによってのみ実行されます。シェルを呼び出すプログラムは、シェルがログインシェルになるかどうかを決定します(シェルの呼び出しで、0番目の引数の最初の文字として-
を指定します)。通常、ログインして特定のコマンドを実行するときには実行されません。
特にOpenSSHは、コマンドを指定しない場合にのみログインシェルを呼び出します。したがって、コマンドを指定した場合、~/.profile
は読み取られません。
OpenSSHでは、サーバー側で環境変数を設定できます。これは、PermitUserEnvironment
ディレクティブを使用して サーバー設定 で有効にする必要があります。変数はファイル ~/.ssh/environment
で設定できます。公開鍵認証を使用すると仮定すると、関連する行の先頭に ~/.ssh/authorized_keys
:add environment="FOO=bar"
でキーごとの変数を設定することもできます。
SSHは、環境変数の送信もサポートしています。 OpenSSHでは、 ~/.ssh/config
のSendEnv
ディレクティブを使用します。ただし、サーバー構成でAcceptEnv
ディレクティブを使用して特定の環境変数を有効にする必要があるため、これがうまく機能しない場合があります。
公開鍵認証を使用している限り、(奇妙なことに)常に機能すると私が思うことの1つは、command=
のauthorized_keys
オプションを(ab)使用することです。ファイル。 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は、rshdまたはsshdによって呼び出された場合、インタラクティブでない場合でも(ただし、sh
として呼び出されている場合は)、常に~/.bashrc
を読み取ります。 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
通常、ログイン時に、bashは次の場所からコマンドを読み取ります。
〜/ .bash_profile
〜/ .bashrc
Bashのmanページから:
〜/ .bash_profile
ログインシェル用に実行される個人用初期化ファイル〜/ .bashrc
対話型シェルごとの個々の起動ファイル
私はこれをテストするために時間を使い果たしましたが、私が見つけたmanページを見ていました:
man bash:bashが非対話的に開始されると、たとえば、シェルスクリプトを実行するために、環境で変数BASH_ENVを探し、そこに表示されている場合はその値を展開し、展開された値をファイルの名前として使用して、読み取りと実行。 Bashは、次のコマンドが実行されたかのように動作します。if [-n "$ BASH_ENV"];その後。 "$ BASH_ENV"; fiですが、PATH変数の値はファイル名の検索には使用されません。
man ssh:〜/ .ssh/environment環境変数の追加定義が含まれています。上記の環境を参照してください。
組み合わせは、sshに.profileを実行させる方法を提案します
残念ながら、私のサーバーではPermitUserEnvironmentがデフォルト値のnoに設定されているため、これは機能しません(私が言ったように、これ以上試す時間はありません)。
(削除...新しいユーザーとしてハイパーリンクを1つだけ持つことができます〜)
申し訳ありませんが、これが上記のリンクが適用されない非インタラクティブセッションに関するものであることは知りません。
BashがSH互換モードで起動すると、POSIX®標準にも準拠しながら、shの過去のバージョンの起動動作をできるだけ模倣しようとします。ログインシェルの場合、読み込まれるプロファイルファイルは/ etc/profileおよび〜/ .profileです。
ログインシェルでない場合、環境変数ENVが評価され、結果のファイル名が起動ファイルの名前として使用されます。
起動ファイルが読み込まれた後、BashはPOSIX(r)互換モードに入ります(起動用ではなく実行用!)。
Bashはsh互換モードで起動します。
- argv [0]のベースファイル名はshです(:!:uber-clever Linuxユーザーに注意してください... :!:)
だから問題は、シェルがこのように起動されたとしても、なぜそれを実行しないのかということです。