AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 943067
Accepted
0x29a
0x29a
Asked: 2018-12-06 13:38:05 +0800 CST2018-12-06 13:38:05 +0800 CST 2018-12-06 13:38:05 +0800 CST

从远程 SSH 连接运行本地 X11 命令

  • 772

当我使用ssh -X连接到我的服务器并在服务器上运行例如xterm时,xterm 在我的本地计算机上打开。

我真正想做的是让安装在服务器上的 xterm 在服务器上打开并在服务器物理显示器上呈现。. 换句话说,如果我坐在服务器旁边并在服务器键盘上输入xterm ,效果相同。

如果我跳过-X参数连接到服务器并运行 xterm,我会得到:

/usr/bin/xterm: Xt error: Can't open display: 
/usr/bin/xterm: DISPLAY is not set

所以我尝试像这样设置DISPLAY变量:

export DISPLAY=localhost:0.0

但后来我得到:

/usr/bin/xterm: Xt error: Can't open display: localhost:0.0

如何运行xterm命令并使其在服务器物理屏幕上执行?

ssh
  • 1 1 个回答
  • 1670 Views

1 个回答

  • Voted
  1. Best Answer
    kasperd
    2018-12-10T03:52:10+08:002018-12-10T03:52:10+08:00

    为了让它工作,你的服务器显然首先必须运行 X 服务器。Linux 服务器通常没有安装任何 X 服务器,因此您必须首先验证服务器上是否存在 X 服务器。

    假设您的服务器实际上正在运行 X 服务器,最可能的解释是您使用错误的协议连接到 X 服务器。

    DISPLAY=localhost:0.0和之间有区别DISPLAY=:0.0。

    当你写localhost:0.0它时,它意味着客户端将解析主机名localhost并通过 TCP 连接到 X 服务器。端口号计算为 6000 加上显示号,此处为 6000 + 0 = 6000。

    当您编写:0.0它时,它意味着客户端将使用 unix 套接字连接到 X 服务器。unix socket的优点是效率更高,访问控制可以基于uid。

    多年来,在 X 服务器中默认禁用 TCP 并且只接受通过 unix 套接字的连接是一种常见的做法。由于您似乎没有特别需要 TCP 连接,我建议您只需更改命令以使用 unix 套接字而不是 TCP 套接字。

    这些命令也可以缩写一点。这个版本应该可以工作:

    DISPLAY=:0 xterm &
    

    xterm虽然这个命令可以工作,但它不会给你与从本地 X 会话开始时完全相同的结果。要获得相同的结果,您需要确保所有环境变量都相同,而不仅仅是DISPLAY变量。桌面环境往往会设置很多环境变量。

    我发现实现这一点的最简单方法是screen在登录到本地 X 会话后启动命令,然后根据需要远程附加到该命令。

    所以登录后我打开一个终端并输入screen -xR somename. 然后按ctrla与d分离。远程登录后,我可以附加到屏幕screen -xR somename并运行我需要的命令,例如xterm&在您的情况下。一旦我完成再次按下ctrla然后d分离。当我偶尔需要重新启动时,这在桌面上非常有用,compiz因为它已锁定。不过,我还没有在服务器上找到任何用途。

    如果您没有screen提前从本地 X 会话启动命令,并且需要从远程 shell 在本地显示器上启动 X 客户端,则需要首先像在本地 X 会话中一样设置所有环境变量。为此,您可以选择该会话中任何现有 X 客户端的 PID,并找到所有环境变量,如下所示:

    tr '\0' '\n' </proc/$PID/environ
    
    • 1

相关问题

  • 如何最好地设置 ssh 隧道以访问远程网络 (Linux)

  • SSH 和重定向

  • 通过 SSH 会话使用 NET USER 命令拒绝访问

  • SSH 服务器零日漏洞利用 - 保护自己的建议

  • ubuntu apt-get upgrade - 如何在 shell 中单击确定?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve