我正在尝试在运行 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
来自 ssh(1) 手册页:“如果指定了命令,它将在远程主机上执行,而不是在登录 shell 上执行。”
简而言之,当您实际登录到计算机时,bash 将作为登录 shell 启动并加载相应的文件,当您远程连接并发出命令时,它将代替 bash 运行,这意味着这些文件不会加载。您可以
su -l -c
在 ssh 的命令部分使用或类似命令来解决此问题。
简单的答案是使用文件的完整路径,而不是 $PATH 中的路径,可以通过使用which
which nano /usr/bin/nano