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

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

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

#cat gui.sh
#!/bin/bash 
./gui -display 127.0.0.1:0.0    

当我从本地计算机(./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]#    

我不知道它要求哪个协议或者我错过了什么?我尝试直接启动应用程序,不使用脚本[ ssh -f 192.168.3.77 "cd /root/Desktop/GUI/ && "./gui""],但结果是相同的。我尝试过各种组合,例如ssh -Yssh -fY等等,但结果是相同的!
其次对于我的应用程序来说,有一个必须条件,我们必须首先进入程序所在的目录。
有什么解决方案吗?

答案1

视频解释了如何逐步解决该错误。如果您不想看,请按照以下文字操作:

未指定协议错误表示“用户不知道如何启动 GUI 应用程序”和“用户没有启动 GUI 应用程序的权限”。视频中的 GUI 应用程序是dbca.

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

答案2

该选项的含义-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"

答案3

ssh -Y应该ssh -X是一个好的开始,但是你也转发了你的 X 服务器吗?

$ grep X /etc/ssh/sshd_config
X11Forwarding yes

否则它不会起作用。

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

$ echo $DISPLAY
$ localhost:10.0

这是在之后运行的ssh -Y。如果我不使用 ssh-Y或 ,则同一变量为空-X

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

答案4

我遇到了同样的问题,我通过更改 DISPLAY 环境变量解决了这个问题:

export DISPLAY=:0.0

export DISPLAY=:10

相关内容