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

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

当我尝试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。

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

请注意,这将影响您通过 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 等机制绕过某些配置中的访问限制。

相关内容