如何从ssh shell运行GUI应用程序?


7

我可以通过ssh和vnc访问我的linux盒子。我想运行一个GUI应用程序,但直接从ssh运行,我不想通过VNC访问并点击。因此,在使用ssh登录后,我想发出一个魔术命令,这样当我通过VNC登录时,我将看到我的GUI应用程序正在运行。我怎样才能做到这一点?

编辑:

linux盒子上运行了X服务器。我需要自动重启GUI应用程序。我想在没有任何GUI交互的情况下做到这一点。我需要的:

  1. 通过SERVER上的ssh登录
  2. 通过强制它绑定到在SERVER上运行的X服务器来运行我的GUI应用程序
  3. ???
  4. 利润!

Answers:


5

我已经阅读了问题的编辑版本,如果我理解正确,你想从SSH运行程序而不向你显示GUI ...你只想运行该程序,它取决于X Windows,所以你需要它以某种方式连接到服务器本身的X Windows。

你需要做两件事。您需要允许来自X Windows外部的连接,然后您需要告诉shell(在SSH中)要绑定哪个X服务器。

首先,允许到X服务器的传入连接。在服务器计算机上的X Windows中打开终端窗口。 (你必须有权访问它,否则你不能这样做。)

发出以下命令:

xhost +

它应该告诉你“允许来自所有主机的连接”或者那种效果。

然后,在仍然保留在X Windows中时,发出:

echo $DISPLAY

这将告诉您显示ID。写下来或记住它。通常它将是“:0”或“:0.0”,但如果不同则不要担心。

这就是你需要从X Windows本身做的所有事情。

现在可以从任何地方SSH到服务器。发出命令:

export DISPLAY=[what-the-echo-command-gave-you]

这应该是它!现在您应该可以从该SSH shell运行任何X窗口,它将在本地X Windows服务器上弹出。

希望能帮助到你!


4
xhost + 是一个非常糟糕的主意。如果您的用户启动了Xserver,那么您应该已经拥有相应的Xauthority文件,无需使用服务器主机acls。
Geoff Reedy

@GeoffReedy我不明白你的意思。按照Helgi的指示,我设法从SSH启动了一个应用程序。我怎么能没有 xhost +?我正在承担什么风险(我必须先登录)?
Camilo Martin

1
@CamiloMartin @Helgi xhost + 关闭x服务器的所有访问控制。任何可以连接到X服务器的人都可以窥探事件,注入事件,转储窗口内容,杀死在X服务器上运行的程序等。这些功能可以用作拒绝服务,任意程序执行或其他不良事情。看到 www2.slac.stanford.edu/computing/security/xwindow 有关此更多信息。您应该在大多数设置下执行的操作 echo $XAUTHORITY 代替。如果它不是空的,那么当你想运行一个GUI程序时呢 export XAUTHORITY=<saved content of $XAUTHORITY>
Geoff Reedy

@GeoffReedy,谢谢你的提示。我自己多年没有使用过这个技巧了,但下次我肯定会搜索Xauthority。
Teekin

@GeoffReedy非常感谢你。把它变成一个脚本!把它 gimme-xauth.sh 在你的/ usr / bin中获得乐趣和Xstasy。 pastebin.com/GXx2hwC5
Camilo Martin

5

您必须将X11转发到本地计算机(从远程计算机)。通过 -X 要么 -Y 调用ssh时的标志。


注意这个问题提到他想在服务器上运行X-server并访问它VNC,而不是在本地运行X-server。
heavyd

4

应用程序显示的内容取决于 DISPLAY 环境变量。做 export DISPLAY=:0.0 让它出现在远程机器的第一个显示器上。


0

首先,这不是一个编程问题(s / b serverfault.com)

但是,您需要在系统上运行X服务器(例如XMing),然后在Linux机器上运行GUI程序,这将把GUI放在您的机器上。


我不想在我的机器上运行这个程序,我希望它在远程主机上运行,​​但是从ssh shell运行,而不是使用vnc。我无法直接从ssh运行它,因为没有为该shell运行的x服务器(?)。

正确 - 查看GUI的唯一方法是在您的计算机上安装X服务器(如果它是X程序)。否则,请参阅mipadi的答案,转发X11替代(这并不总是有效)
KevinDTimm

有没有办法强制应用程序以某种方式“绑定”到在Linux机器上运行的X服务器?我不需要与GUI交互,只需运行应用程序。我想强迫它使用服务器上的X。我更新了我的问题以便更好地解释。

0

仅供参考,您可以在Windows领域做类似的事情,例如启动UNIX进程,使用 WinSSHD 和/或 Tunnelier

如果你的意思是在本地X windows会话中启动gui,那么你需要将DISPLAY变量设置为local(Tunnelier可能有一个设置),因为你在Windows上需要将它与运行x-window模拟器结合起来在窗户上(如 cygwin的-X


0

我发现使用终端多路复用器这样做最容易 screen 要么 tmux。它不需要搞乱 xhost。复制和粘贴授权,或类似的东西。

基本理念:

  1. 在远程计算机上,打开虚拟X终端;在那个虚拟终端中,启动一个 screen 要么 tmux 会话。 (这确实意味着在VNC中点击,但这是你必须这样做的唯一时间。)
  2. 现在,无论何时SSH到远程计算机,都可以附加到此 screen 要么 tmux 会话。
  3. 连接后,您可以运行任何GUI应用程序,它应该在远程计算机上弹出,就像您从那里运行它一样。

GNU屏幕示例:

在远程机器的虚拟终端中(通过VNC或物理打开):

you@remote:~$ screen -S myscreen

然后,当您进入SSH时,您可以只附加到该会话:

you@remote:~$ screen -x myscreen

然后,在屏幕会话中,运行您想要的任何应用程序:

you@remote:~$ myapp &
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.