![如何通过 SSH 在 Gnome 中使用 SFTP URL 远程打开 gedit?](https://linux22.com/image/1309957/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%20SSH%20%E5%9C%A8%20Gnome%20%E4%B8%AD%E4%BD%BF%E7%94%A8%20SFTP%20URL%20%E8%BF%9C%E7%A8%8B%E6%89%93%E5%BC%80%20gedit%EF%BC%9F.png)
我的设置很奇怪,现在无法更改。我有两台机器:
local-machine
:这是我的桌面,运行的是 Ubuntu 和 Gnomeremote-machine
:它是一台虚拟机,也运行 Ubuntu,但没有 X
在两台机器上我都有我的私钥和公钥 SSH 密钥。
我需要从 运行 SSHremote-machine
并local-machine
运行 gedit(在 中local-machine
,在默认的 $DISPLAY 下),但通过 SFTP 打开文件remote-machine
。如下所示:
myuser@remote-machine:~$ ssh local-machine "DISPLAY=:0.0 gedit sftp://remote-machine/some/file"
上述命令不起作用。gedit 显示以下消息:
Could not open the file sftp://remote-machine/some/file.
gedit cannot handle sftp: locations.
注意:
/some/file
存在于remote-machine
。- 我可以使用我的 SSH 密钥正常地从 到
remote-machine
进行local-machine
SSH 操作,没有任何问题! - 我可以
DISPLAY=:0.0 gedit sftp://remote-machine/some/file
在终端上运行该命令,并且 gedit可以毫无问题地local-machine
打开该文件- 但是我在执行该命令的终端在 DISPLAY:0 中运行(真的,它是)。remote-machine
gnome-terminal
- 我也尝试了
-t
SSH 客户端选项(强制伪 tty 分配)但没有作用。 - 如果我尝试
DISPLAY=:0.0 gedit sftp://remote-machine/some/file
在local-machine
但在 tty 下运行(例如在 中tty1
,按<Ctrl>+<Alt>+<F1>
),它不起作用——从 运行时我收到相同的错误remote-machine
。
我发现,如果我传递DBUS_SESSION_BUS_ADDRESS
正确的环境变量,它就会起作用!所以,如果我做这样的事情:
myuser@local-machine:~$ env | grep DBUS_SESSION_BUS_ADDRESS > env.txt
myuser@local-machine:~$ scp env.txt remote-machine:
进而:
myuser@remote-machine:~$ ssh local-machine "DISPLAY=:0.0 $(cat env.txt) gedit sftp://remote-machine/some/file"
成功了!问题是我不在local-machine
所以我无法获取此环境变量的正确值。还有其他方法可以实现此目的吗?
答案1
我找到了另一种获取环境变量的方法,而不是传递整个环境变量:将启动 SSH 会话的进程的 PID 从本地发送到远程机器,这样我们以后就可以从该 PID 获取所有环境变量。
当我从远程计算机运行 SSH 到本地计算机时,我会执行一个命令来从该 PID 获取环境(使用/proc/<PID>/environ
),然后在该环境中执行该命令。请注意,这仅适用于 Linux(或具有的操作系统/proc
)。
就像是这样的:
将本地机器上运行的 bash 的 PID 发送到远程文件:
user@local-machine:~$ ssh other-user@remote-machine "echo $$ > \$HOME/.local_bash_pid"
创建连接:
user@local-machine:~$ ssh other-user@remote-machine
在远程运行 SSH 以在本地执行命令:
other-user@remote-machine:~$ ssh user@local-machine "source <(cat /proc/$(cat $HOME/.local_bash_pid)/environ | tr '\0' ' ') && command-I-want-to-execute-on-that-environment"