この問題は、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
を見つけるにはどうすればよいですか?前もって感謝します
-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を起動するために公開鍵認証を使用することです。
これは、SSHを介して通常ログインする機能に影響することに注意してください。そのためには、公開鍵認証をバイパスする必要があります。
svn -o PubkeyAuthentication=no user@server
たまたま、.bashrc
と.bash_profile
は、対話型シェルを使用している場合にのみ実行されます。 sshを介してログインすると、対話型シェルではないため、カスタムPATH
定義は実行されません。 BASH_ENV
を使用して、スクリプトを非インタラクティブシェルに関連付けることができます。 .ssh/environment
も確認してください。これにより、別の選択肢が提供されます。これについて知る最良の方法は、man ssh
を実行することです。
幸運を!
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は必要ありません。
Envコマンドを実行できます:
ssh servername "env PATH = $ REMOTEPATH which svnserve"
変数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を実行するのにパスワードは必要ありませんでした。