如何在PyCharm SSH会话中启用X11转发?

33

问题

我正在尝试通过 PyCharmSSH 终端 启用 X11 转发,该终端可以通过以下方式执行:

"Tools -> Start SSH session..."

不幸的是,似乎没有办法像在我的 shell 中启用 X11 转发那样指定标识:

ssh -X user@remotehost

您知道实现这个的一些巧妙方法吗?


当前的临时解决方案

我找到的唯一的临时解决方案是通过打开一个带有X11转发的外部SSH连接,然后手动更新环境变量DISPLAY

例如,我可以在我的外部 SSH 会话中运行:

vincenzo@remotehost:$ echo $DISPLAY
localhost:10.0

然后在我的 PyCharm 终端上设置:

export DISPLAY=localhost:10.0
如果我想从GUI运行程序,我可以更新 Run / Debug Configuration 中的DISPLAY变量。
然而,我真的不喜欢使用外部ssh终端并手动更新DISPLAY变量的解决方法,我相信有更好的方法来实现这个目标!
任何帮助都将不胜感激。

P.s. 像这样创建别名:

alias ssh='ssh -X'

在我的.bashrc中没有强制 PyCharm 启用 X11 转发。


2
我发现PyCharm不使用系统SSH,而是使用JSch,这是一个纯Java实现的SSH。JSch支持X11转发,但默认情况下未启用。解决问题的一种方法是将PyCharm捆绑的jsch.jar替换为具有不同默认值的自定义版本。 - Oliver Weissbarth
感谢@OliverWeissbarth的评论!如果您能够提供更多细节和逐步解决方案的实际答案,我将非常高兴将其标记为批准! - Gengiolo
他们在这里有一个关于此问题的开放问题: https://youtrack.jetbrains.com/issue/PY-13869
目前看来没有官方解决方案 :(
- MZHm
也许你应该尝试使用外部 SSH 工具,如此处所述 https://www.jetbrains.com/help/pycharm/using-the-pycharm-built-in-ssh-terminal-and-remote-ssh-external-tools.html。你可以在那里指定额外的 SSH 参数。 - Alexey Barsuk
@AlexeyBarsuk 很遗憾,那是针对可以在已建立的ssh连接上运行的程序... - Gengiolo
1
实际上,我非常感谢你的解决方案。谢谢你。我最初无法复制它,因为我使用了matplotlib.use('Agg') 设置 matplotlib 的后端,但当我注释掉那一行时,它就像魔法一样运行了。留下这个评论是为了提醒其他遇到同样问题的人。 - Homero Esmeraldo
5个回答

7

因此,我成功修补了jsch并进行了测试,效果非常好。

使用X11转发

要在PyCharm中使用X11转发,您需要执行以下操作:
- 如果尚未安装X服务器,则需要安装一个。在Windows上可能是VcXsrv项目,在Mac OS X上则是XQuartz项目。
- 下载或编译jsch软件包。请参见下面的编译说明。
- 在pycharm的lib文件夹中备份jsch-0.1.54.jar并将其替换为修补版本。使用远程环境启动Pycharm,并确保删除您可能在运行/调试配置中设置的任何DISPLAY环境变量实例。

编译

以下是在已安装Maven的Mac OS或Linux系统上需要执行的操作。

wget http://sourceforge.net/projects/jsch/files/jsch/0.1.54/jsch-0.1.54.zip/download
unzip download
cd jsch-0.1.54
sed -e 's|x11_forwarding=false|x11_forwarding=true|g' -e 's|xforwading=false|xforwading=true|g' -i src/main/java/com/jcraft/jsch/*.java
sed -e 's|<version>0.1.53</version>|<version>0.1.54</version>|g' -i pom.xml
mvn clean package

这将在target文件夹中创建jsch-0.1.54.jar

启用X11


嗨Tarun!感谢你的解决方案。现在变量$DISPLAY似乎已经自动设置了,但是如果我运行像“eog img.png”这样的命令,我会得到以下提示:“(eog:40789):警告:无法打开X显示”。你知道如何解决吗? - Gengiolo
@Gengiolo,我已经测试过了,可能需要调用更多的方法 http://www.jcraft.com/jsch/examples/X11Forwarding.java.html。不幸的是,我没有时间进一步调试这个问题。但这应该给你一个探索的方向和如何完成它。 - Tarun Lalwani
谢谢你的努力,你值得这份奖赏! :) 我会尽快查看并更新这个帖子! - Gengiolo
这对我没用。你用的是哪个版本的Pycharm?谢谢。 - aarbelle
1
你可以在截图中看到它是“2017.2.4”某个版本。 - Tarun Lalwani

6

2020年更新:我找到了一个非常简单的解决方案,可能是由于 PyCharm 版本更新(2020.1)。

  1. 确保服务器上启用了 X11Forwarding :在/etc/ssh/sshd_config中设置
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost no

2. 在客户端(对我来说是MacOS)上:在~/.ssh/config中设置
ForwardX11 yes
  1. 在 PyCharm 中取消选中 Include system environment variables。这将解决 DISPLAY 变量被设置为系统变量的问题。 enter image description here

编辑:如下图所示,它可以工作。例如,我使用了 DeepLab 的 PyTorch 实现,并可视化来自 PASCAL VOC 的样本图像: enter image description here


问题描述以及其他答案中已经解释了:PyCharm不使用系统ssh,连接默认打开而没有X11转发。因此,您需要打开另一个外部ssh连接才能使其工作。您如何测试您的解决方案?一个简单的测试是使用matplolib显示图像,如果matplolib GUI出现在屏幕上,则表示它可以工作。如果您能做到,请告诉我们! - Gengiolo
我增加了一个“证明”。 - oezguensi
3
PyCharm的“SciView”未使用X11转发:https://dev59.com/FVYM5IYBdhLWcg3wzSog 如果你只想查看图像,这可能很有用,但不能用于其他X窗口应用程序! - Gengiolo
1
哦,我明白了。我不知道那个。感谢您的澄清。我一直在努力在SciView中绘制图像,这种方法对我有用。 - oezguensi
1
我在Linux Mint上使其工作了,但我必须添加一个用户环境变量DISPLAY并将其设置为:10.0。 - docPhil
显示剩余8条评论

2
所有基于IntelliJ的IDE都已经在2021.1中实现了X11转发。如果仍然无法正常工作,请考虑在youtrack.jetbrains.com上创建一个新问题。
顺便说一句,有关修补jsch的建议对于任何新于2019.1版本的IDE都不起作用。

0
同时,在打开MobaXTerm并启用X11转发复选框的情况下连接。现在,PyCharm将通过MobaXTerm X11服务器转发显示。 直到PyCharm添加了这个“简单”的功能为止。
此外,在PyCharm运行配置中设置DISPLAY环境变量,如下所示: DISPLAY=localhost:10.0 (右侧应使用服务器端的echo $DISPLAY命令获得)

嗨Hesham,感谢您的建议,但我宁愿不要并行打开任何东西。最终,在外部终端中打开或手动更新DISPLAY变量并不是什么大问题,但在PyCharm中运行所有内容会很好,认为不能这样做真是太疯狂了! - Gengiolo

0

2022年更新:对于高于2022.1版本的PyCharm:在SciView中绘图仅需在.ssh/config中设置ForwardX11 yes(我的笔记本操作系统是Ubuntu 22.04)。我在服务器或本地端没有设置任何其他参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接