(svn + ssh)让bash通过SSH加载我的PATH

这个问题出现在我试图通过SSH在服务器上使svnserve (Subversion服务器)可用。 我编译SVN并将其安装在$HOME/bin 。 本地访问(不通过SSH)工作正常。

svn+ssh连接由于以下原因而失败:

 bash: svnserve: command not found 

debugging这个,我发现:

 ssh user@server "which svnserve" 

说:

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

这很奇怪,因为我在.bashrc更新了$HOME/bin的path,并将其添加到~/.ssh/environment 。 但是,似乎SSH不读取它。 虽然当我运行:

 ssh user@server "echo $PATH" 

确实打印我更新的path!

这里发生了什么? 我如何让SSHfind我的svnserve ? 提前致谢

您可以尝试使用-l命令通过bash启动命令,使其充当loginshell

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

正如我在上面留下的评论中指出的那样,您需要转义所有$,所以variables在服务器上扩展,而不是在本地。 例如:

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

更新:

关于你为什么.ssh / environment不起作用的问题,我相信SSHd的默认configuration是忽略用户环境。 您需要在/ etc / ssh / sshd_config(或类似的)中专门启用它并添加:

 PermitUserEnvironment yes 

更新2:

如果您无权访问/ etc / ssh / sshd_config,则可能(但不是理想的)解决scheme是使用公钥validation在login时启动svnserve。

请参阅http://svnbook.red-bean.com/en/1.4/svn.serverconfig.svnserve.html#svn.serverconfig.svnserve.sshtricks

请注意,这将影响您通过SSH正常login的能力。 为此,您需要绕过公钥authentication:

 svn -o PubkeyAuthentication=no user@server 

碰巧, .bashrc.bash_profile只能在交互式shell中执行。 当您通过sshlogin时,您不在交互式shell中,因此您的自定义PATH定义从不运行。 您可以使用BASH_ENV将脚本与非交互式片材相关联。 也检查.ssh/environment ,这给你另一种select。 了解这个最好的方法是通过man ssh

祝你好运!

你可以执行一个env命令:

 ssh servername“env PATH = $ REMOTEPATH其中svnserve”

我和HostMonster有同样的问题,由于他们最近做了一些改变。 我在http://svn.haxx.se/dev/archive-2007-02/0204.shtml的旧电子邮件主题中find了一个工作区:

在你的工作站上:

  • 编辑~/.subversion/config :find[tunnels]并添加行ssh =〜/ svnssh
  • 在链接中创build〜/ svnssh:

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

  • chmod +x ~/svnssh

在你的bleuhost帐户上:

  • 创build~/sshsvnserve ,与链接内容相同:

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

  • chmod +x ~/sshsvnserve

而已。 在处理svn + ssh命名空间时,config [tunnels]修改了svn运行的命令,而改用了ur〜/ svnssh脚本。 该脚本调用ssh,并将完整path传递给您的bluehost帐户上的sshsvnserve。 和sshsvnserveredirect到svnserve的完整path,因为你安装它。 为我工作,不需要$ PATH。

将variablesBASH_ENV设置为'~/.bashrc'

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

man bash

当bash被作为一个交互式的loginshell或者作为一个带-login选项的非交互式shell被调用时,它首先读取并执行文件/ etc / profile中的命令(如果该文件存在的话)。 读取该文件后,它将按照该顺序查找〜/ .bash_profile,〜/ .bash_login和〜/ .profile,并从第一个存在并读取的第一个中读取和执行命令。

当一个不是loginshell的交互式shell被启动时,如果这些文件存在,bash将从/etc/bash.bashrc和〜/ .bashrc中读取和执行命令。

当bash以非交互方式启动时,为了运行一个shell脚本,例如,它在环境中查找variablesBASH_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之类的机制的一些configuration中的访问限制。

我能得到ssh运行使用远程path的命令:

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

这将加载远程.profile等。这里env可以replace为你想要的任何命令。

我有授权的密钥,所以不需要密码来运行命令或SSH。