web-dev-qa-db-ja.com

(svn + ssh)bashにSSH経由でPATHをロードさせる

この問題は、svnserve(Subversionサーバー)をSSH経由でサーバー上で使用可能にしようとしているときに発生します。 SVNをコンパイルして$HOME/binにインストールしました。 SSH経由ではなく、ローカルアクセスで問題なく動作します。

svn+sshへの接続は次の理由で失敗します:

bash: svnserve: command not found

これをデバッグすると、次のことがわかりました。

ssh user@server "which svnserve"

言う:

which: no svnserve in (/usr/bin:/bin)

$HOME/bin.bashrcへのパスを更新し、~/.ssh/environmentにも追加したため、これは奇妙です。ただし、SSHはそれを読み取らないようです。私が実行すると:

ssh user@server "echo $PATH"

それする私の更新されたパスを印刷する!

何が起きてる? SSHでsvnserveを見つけるにはどうすればよいですか?前もって感謝します

6
Eli Bendersky

-lコマンドを使用してbash経由でコマンドを起動して、ログインシェルとして機能させることができます。

ssh user@server "bash -l -c 'which svnserve'"

上で残したコメントで述べたように、変数はローカルではなくサーバー上で展開されるように、すべての$をエスケープする必要があります。例えば。:

ssh user@server "bash -l -c 'echo \$PATH'"

更新:

.ssh/environmentが有効にならない理由についての質問に関して、SSHdのデフォルト設定ではユーザー環境を無視することになると思います。/etc/ssh/sshd_config(または同様のもの)で具体的に有効にし、以下を追加する必要があります。

PermitUserEnvironment yes

更新2:

/ etc/ssh/sshd_configにアクセスできない場合、考えられる(ただし理想的ではない)ソリューションは、ログイン時にsvnserveを起動するために公開鍵認証を使用することです。

http://svnbook.red-bean.com/en/1.4/svn.serverconfig.svnserve.html#svn.serverconfig.svnserve.sshtricks を参照してください

これは、SSHを介して通常ログインする機能に影響することに注意してください。そのためには、公開鍵認証をバイパスする必要があります。

svn -o PubkeyAuthentication=no user@server
4
Shawn Chin

たまたま、.bashrc.bash_profileは、対話型シェルを使用している場合にのみ実行されます。 sshを介してログインすると、対話型シェルではないため、カスタムPATH定義は実行されません。 BASH_ENVを使用して、スクリプトを非インタラクティブシェルに関連付けることができます。 .ssh/environmentも確認してください。これにより、別の選択肢が提供されます。これについて知る最良の方法は、man sshを実行することです。

幸運を!

3
Paulo Matos

HostMonsterでも、最近の変更により、同じ問題があります。 http://svn.haxx.se/dev/archive-2007-02/0204.shtml の古いメールスレッドで回避策を見つけました。

ワークステーションで:

  • 編集~/.Subversion/config:[トンネル]を見つけて、行ssh =〜/ svnsshを追加します
  • リンクのように〜/ svnsshを作成します。

    #!/bin/sh
    /usr/bin/ssh $1 /<ur_bluhost_home_path>/sshsvnserve -t

  • chmod +x ~/svnssh

Bleuhostアカウントで:

  • 作成~/sshsvnserve、リンクと同じ内容:

    #!/bin/sh
    /<ur_bluehost_home_path>/bin/svnserve $*

  • chmod +x ~/sshsvnserve

それでおしまい。 config [tunnels]の変更により、svn + ssh名前空間を処理するときにsvnによって実行されるコマンドが変更され、代わりにur〜/ svnsshスクリプトが使用されます。スクリプトはsshを呼び出し、ur bluehostアカウントのsshsvnserveへの完全パスを渡します。そして、sshsvnserveは、インストールすると、すべてをsvnserveのフルパスにリダイレクトします。 $ PATHは必要ありません。

1
Remus Rusanu

Envコマンドを実行できます:

 ssh servername "env PATH = $ REMOTEPATH which svnserve" 
1
Charles Stewart

変数BASH_ENV'~/.bashrc'に設定します。

ssh servername "BASH_ENV='~/.bashrc' which svnserve"

man bashから:

Bashが対話型ログインシェルとして、または--loginオプションを使用して非対話型シェルとして呼び出されると、ファイル/ etc/profileが存在する場合、そのファイルからコマンドが最初に読み取られて実行されます。そのファイルを読み取った後、〜/ .bash_profile、〜/ .bash_login、および〜/ .profileをこの順序で検索し、存在していて読み取り可能な最初のコマンドからコマンドを読み取って実行します。

そして

ログインシェルではないインタラクティブシェルが起動すると、bashは/etc/bash.bashrcおよび〜/ .bashrcからコマンドを読み取り、これらのファイルが存在する場合はそれらを実行します。

そして

Bashが非対話的に開始されると、たとえば、シェルスクリプトを実行するために、環境で変数BASH_ENVを探し、そこに表示されている場合はその値を展開し、展開した値をファイルの名前として使用して読み取りおよび実行します。

man sshから:

さらに、sshは〜/ .ssh/environmentを読み取り、ファイルが存在し、ユーザーが環境を変更できる場合は、「VARNAME = value」形式の行を環境に追加します。詳細については、sshd_config(5)のPermitUserEnvironmentオプションを参照してください。

man sshd_configから:

PermitUserEnvironment
〜/ .ssh/authorized_keysの〜/ .ssh/environmentおよびenvironment =オプションがsshd(8)によって処理されるかどうかを指定します。デフォルトは「いいえ」です。環境処理を有効にすると、ユーザーは、LD_PRELOADなどのメカニズムを使用して、一部の構成でアクセス制限をバイパスできる場合があります。

次のコマンドを実行することで、sshにリモートパスを使用してコマンドを実行させることができました。

ssh dist@d6 "bash --login -c 'env'"

これにより、リモートの.profileなどがロードされます。ここで、envは、任意のコマンドで置き換えることができます。

私は認証済みのキーを持っているので、コマンドやsshを実行するのにパスワードは必要ありませんでした。

0
Ian