我尝试使用以下代码将 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
。