通过 ssh 从远程机器运行时出现“未指定协议”错误

TPS*_*TPS 18 ssh x11

我有一个脚本,只是为了运行我的图形 (GUI) 应用程序,如下所示。

#cat gui.sh
#!/bin/bash 
./gui -display 127.0.0.1:0.0    
Run Code Online (Sandbox Code Playgroud)

当我从本地机器 ( ./gui.sh)运行它时,它运行得非常好。但是当我尝试通过 ssh 从远程机器运行它时,出现以下错误。

[root@localhost]# ssh -f 192.168.3.77 "cd /root/Desktop/GUI/ && "./gui.sh""   
No protocol specified  
gdm: cannot connect to X server 192.168.3.77:0.0   
[root@localhost]#    
Run Code Online (Sandbox Code Playgroud)

我不知道,它要求的是哪种协议还是我遗漏了什么?我通过启动应用程序直接尝试,没有脚本 [ ssh -f 192.168.3.77 "cd /root/Desktop/GUI/ && "./gui""],但结果是一样的。我尝试了各种组合,如ssh -Y,ssh -fY和更多,但结果是一样的!
其次对于我的应用来说,有一个必须的条件,就是我们要先进入程序所在的目录。
任何解决方案?

Vis*_*a k 8

视频解释了如何逐步解决错误。如果你不想看,那么按照下面的文字:

No protocol specified 错误表示“用户不知道如何启动 GUI 应用程序”和“用户无权启动 GUI 应用程序”。在视频中,GUI 应用程序是dbca.

该视频的关键部分是运行命令xhost +,该命令授予用户从远程系统向本地系统远程显示 GUI 的权限。

  • `xhost +` 将允许任何人连接到您的显示器。我会推荐`xhost +local:[hostname or ip]` (7认同)

Gil*_*il' 6

该选项的含义-display 127.0.0.1:0.0取决于该gui程序,但很可能表示“在 X 显示器上显示 127.0.0.1:0.0”。这是第一个本地 X 显示,通过 TCP 访问。由于两个原因,这几乎肯定是错误的。首先,本地 X 显示应该是:0,不是127.0.0.1:0,因为包含 IP 地址会导致流量通过 TCP 而不是本地访问。根据 X 服务器是否接受 TCP 连接,通过 TCP 可能不起作用。即使是这样,您也会失去本地显示器所具有的优化。

要使用的显示通常由DISPLAY环境变量指示,并且该变量往往会自动正确设置。(通常,如果DISPLAY有错误的值,那是因为你一直在弄乱它。主要的例外是使用screenor tmux。)

您的程序可能确实会查找DISPLAY环境变量的值,因为这往往会随着 xlib 调用而自动发生。所以你应该只调用./gui,你的脚本没有做任何有用的事情。如果您的程序坚持该-display参数,请使其使用环境变量:

./gui -display "$DISPLAY"
Run Code Online (Sandbox Code Playgroud)


has*_*ier 5

ssh -Yssh -X应该是一个很好的开始,但你转发你的X服务器呢?

$ grep X /etc/ssh/sshd_config
X11Forwarding yes
Run Code Online (Sandbox Code Playgroud)

否则它不会工作。

要检查的另一件事是 DISPLAY 变量,它应该显示如下内容:

$ echo $DISPLAY
$ localhost:10.0
Run Code Online (Sandbox Code Playgroud)

这是在ssh -Y. 如果我没有 ssh-Y或ssh,则相同的变量为空-X

有关两者之间的差异-X,请-Y阅读 ssh 的手册页。


小智 5

Debian Jessie,还添加:

export XAUTHORITY=/.Xauthority
Run Code Online (Sandbox Code Playgroud)