当我尝试svnserve
通过 SSH 在服务器上使用(Subversion 服务器)时,出现了此问题。我编译了 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
。但是,SSH 似乎没有读取它。虽然当我运行:.bashrc
~/.ssh/environment
ssh user@server "echo $PATH"
它做打印我更新的路径!
这是怎么回事?我怎样才能让 SSH 找到我的svnserve
?提前致谢
答案1
您可以尝试使用 -l 命令通过 bash 启动该命令,以便它充当登录 shell
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
答案2
事实上,.bashrc
和.bash_profile
仅在您处于交互式 shell 中时才执行。当您通过 ssh 登录时,您不在交互式 shell 中,因此您的自定义PATH
定义永远不会运行。您可以使用 将脚本关联到非交互式 shell BASH_ENV
。还请查看.ssh/environment
,这为您提供了另一种选择。了解这一点的最佳方法是执行man ssh
。
祝你好运!
答案3
您可以执行 env 命令:
ssh 服务器名“env PATH=$REMOTEPATH which svnserve”
答案4
将变量设置BASH_ENV
为'~/.bashrc'
。
ssh servername "BASH_ENV='~/.bashrc' which svnserve"
从man bash
:
当 bash 作为交互式登录 shell 或使用 --login 选项作为非交互式 shell 调用时,它首先从文件 /etc/profile 中读取并执行命令(如果该文件存在)。读取该文件后,它会按顺序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,然后从第一个存在且可读的文件中读取并执行命令。
和
当启动非登录 shell 的交互式 shell 时,bash 会从 /etc/bash.bashrc 和 ~/.bashrc 读取并执行命令(如果这些文件存在)。
和
当 bash 以非交互方式启动时,例如,要运行 shell 脚本,它会在环境中查找变量 BASH_ENV,如果出现则扩展其值,并使用扩展的值作为要读取和执行的文件的名称。
从man ssh
:
此外,如果文件存在且允许用户更改其环境,ssh 会读取 ~/.ssh/environment,并向环境中添加格式为“VARNAME=value”的行。有关更多信息,请参阅 sshd_config(5) 中的 PermitUserEnvironment 选项。
从man sshd_config
:
PermitUserEnvironment
指定 ~/.ssh/environment 和 ~/.ssh/authorized_keys 中的 environment= 选项是否由 sshd(8) 处理。默认值为“no”。启用环境处理可能使用户能够使用 LD_PRELOAD 等机制绕过某些配置中的访问限制。