web-dev-qa-db-ja.com

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/shbashにリンクしていますが、これは当然のことです。驚いたのは、私のプロフィールがまだ無視されていることです。助言がありますか?

10
TheLQ

質問の中で言及したコマンドは、

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$ 

ローカルシェルが変数を展開しないように引用符を使用する必要があることに注意してください。

8
wrosecrans

~/.profileは、ログインシェルによってのみ実行されます。シェルを呼び出すプログラムは、シェルがログインシェルになるかどうかを決定します(シェルの呼び出しで、0番目の引数の最初の文字として-を指定します)。通常、ログインして特定のコマンドを実行するときには実行されません。

特にOpenSSHは、コマンドを指定しない場合にのみログインシェルを呼び出します。したがって、コマンドを指定した場合、~/.profileは読み取られません。

OpenSSHでは、サーバー側で環境変数を設定できます。これは、PermitUserEnvironmentディレクティブを使用して サーバー設定 で有効にする必要があります。変数はファイル ~/.ssh/environment で設定できます。公開鍵認証を使用すると仮定すると、関連する行の先頭に ~/.ssh/authorized_keys :add environment="FOO=bar"でキーごとの変数を設定することもできます。

SSHは、環境変数の送信もサポートしています。 OpenSSHでは、 ~/.ssh/configSendEnvディレクティブを使用します。ただし、サーバー構成で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##*/}" "$@"

次に、rsyncunisonなどと呼ばれるこのスクリプトへのシンボリックリンクを作成します。他のプログラムの場合は、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に設定されているため、これは機能しません(私が言ったように、これ以上試す時間はありません)。

0
kasterma

(削除...新しいユーザーとしてハイパーリンクを1つだけ持つことができます〜)

更新

申し訳ありませんが、これが上記のリンクが適用されない非インタラクティブセッションに関するものであることは知りません。

BashがSH互換モードで起動すると、POSIX®標準にも準拠しながら、shの過去のバージョンの起動動作をできるだけ模倣しようとします。ログインシェルの場合、読み込まれるプロファイルファイルは/ etc/profileおよび〜/ .profileです。

ログインシェルでない場合、環境変数ENVが評価され、結果のファイル名が起動ファイルの名前として使用されます。

起動ファイルが読み込まれた後、BashはPOSIX(r)互換モードに入ります(起動用ではなく実行用!)。

Bashはsh互換モードで起動します。

  • argv [0]のベースファイル名はshです(:!:uber-clever Linuxユーザーに注意してください... :!:)

だから問題は、シェルがこのように起動されたとしても、なぜそれを実行しないのかということです。

ソース

0
phant0m