非交互式 ssh 会话找不到命令,即使它在 PATH 中

非交互式 ssh 会话找不到命令,即使它在 PATH 中

我正在尝试在运行 mac os 10.9.5 的服务器上通过 ssh 运行命令,命令如下

ssh server.address command

并收到错误bash: command: command not found

当我使用交互式会话登录时,一切工作正常,命令位于/usr/local/bin/command

$ which command
/usr/local/bin/command

当我从客户端通过 ssh 请求非交互式路径时,它包括/usr/local/bin

$ ssh server.address "echo $PATH"
/Users/me/.rvm/gems/ruby-2.1.10/bin:/Users/me/.rvm/gems/ruby-2.1.10@global/bin:/Users/me/.rvm/rubies/ruby-2.1.10/bin:/Users/me/anaconda3/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Library/TeX/texbin:/Users/me/.rvm/bin

所以我不确定为什么它找不到该命令(或任何命令/usr/local/bin

我怀疑这是因为在 开头的那些奇怪的路径$PATH(比如/Users/me/.rvm/gems/ruby-2.1.10@global/bin,但我首先找不到这些路径被添加到路径的哪里。我检查了~/.bash_profile和。当我以交互方式登录时,~/.profile那些 ruby​​ 路径也不在 中。PATH

我不知道接下来该做什么。使用命令的完整路径不是一个选项,因为它是从另一个程序调用的。(另外,如果我无法/usr/local/bin进入我的路径,这个问题肯定会再次出现)。

提前感谢你的帮助!

答案1

$ ssh server.address "echo $PATH"

返回你的本地外壳即使它是从远程写入的。引号中的变量扩展是在将命令发送到服务器之前完成的。要获取远程路径,您需要使用

$ ssh server.address 'echo $PATH'

答案2

因此,据我所知,这基本上是https://serverfault.com/questions/351731/why-does-the-path-of-an-ssh-remote-command-differ-from-that-of-an-interactive-s

来自 ssh(1) 手册页:“如果指定了命令,它将在远程主机上执行,而不是在登录 shell 上执行。”

简而言之,当您实际登录到计算机时,bash 将作为登录 shell 启动并加载相应的文件,当您远程连接并发出命令时,它将代替 bash 运行,这意味着这些文件不会加载。您可以su -l -c在 ssh 的命令部分使用或类似命令来解决此问题。

简单的答案是使用文件的完整路径,而不是 $PATH 中的路径,可以通过使用which

which nano /usr/bin/nano

相关内容