XForwarding 未加载正确的 $PATH

XForwarding 未加载正确的 $PATH

我尝试使用以下代码将 netbeans XForward 到我的笔记本电脑:

# This does not work
$ ssh [email protected] -Y netbeans
which: no javac in (/usr/bin:/bin:/usr/sbin:/sbin)
which: no java in (/usr/bin:/bin:/usr/sbin:/sbin)
Cannot find java. Please use the --jdkhome switch.

这不起作用,但这样做了:

# This works
$ ssh [email protected] -Y
user@home $ netbeans

我的问题:

  • 为什么第一种方法会失败?
  • 我怎样才能使第一种方法起作用?

答案1

ssh example.com somecommand不读你的~/.profile;somecommand由 ssh 守护进程直接执行。当您未指定命令时,ssh 守护程序会调用您的登录 shell,该 shell 会读取您的~/.profile. (替换~/.bash_profile~/.zprofile~/.login取决于您的登录 shell。)

有几种方法可以为非交互式命令设置环境变量,但它们都需要在服务器配置中进行设置,该设置通常默认情况下处于关闭状态。假设双方都有足够新的 OpenSSH:

  • SendEnv您可以使用以下指令将环境变量从客户端发送到服务器~/.ssh/config。必须使用AcceptEnv以下指令启用特定的环境变量服务器配置

  • 您可以通过设置环境变量~/.ssh/environment在服务器端。必须在以下位置启用此功能服务器配置PermitUserEnvironment指令。

  • 假设您使用基于密钥的身份验证,您还可以在中设置每个源变量~/.ssh/authorized_keys: 添加environment="FOO=bar"在相关行的开头。同样,您需要PermitUserEnvironment在服务器配置中使用该指令。

如果您不能或不想更改服务器配置,则必须编写远程命令的完整路径,或者.profile在远程命令中显式指定您的路径。

ssh [email protected] -Y '. ~/.profile; netbeans'
ssh [email protected] -Y '/path/to/netbeans'

答案2

来自ssh(1) 手册页(我的重点):

如果指定了命令,则在远程主机上执行该命令反而登录 shell 的。

换句话说,当您向 ssh 传递命令时,它不会在远程系统上进行“登录”。它以非登录、非交互模式运行 shell,这会导致运行一组不同的初始化文件。

您应该检查 PATH 变量的设置位置,并将其移至适当的文件。例如,如果您的 shell 是 bash,则应该使用.bashrc, 而不是.bash_profile

相关内容