![通过 ssh 从远程计算机运行时出现错误“未指定协议”](https://linux22.com/image/49270/%E9%80%9A%E8%BF%87%20ssh%20%E4%BB%8E%E8%BF%9C%E7%A8%8B%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%BF%90%E8%A1%8C%E6%97%B6%E5%87%BA%E7%8E%B0%E9%94%99%E8%AF%AF%E2%80%9C%E6%9C%AA%E6%8C%87%E5%AE%9A%E5%8D%8F%E8%AE%AE%E2%80%9D.png)
我有一个脚本,只是为了运行我的图形(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 -Y
,ssh -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
有错误的值,那是因为你弄乱了它。主要的例外是使用screen
or 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