質問: ssh経由のshスタートアップファイル 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にリンクしていますが、これは当然のことです。驚いたのは、私のプロフィールがまだ無視されていることです。助言がありますか?
回答: ~/.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