如何在不退出远程服务器上的R的情况下恢复X11连接
短版本:在远程计算机上工作时,如何从R中重新启动丢失的X11连接 长版本:如何在不退出远程服务器上的R的情况下恢复X11连接,r,ssh,x11-forwarding,xquartz,R,Ssh,X11 Forwarding,Xquartz,短版本:在远程计算机上工作时,如何从R中重新启动丢失的X11连接 长版本: 设置 我使用Mac11.1并连接到远程Linux服务器,以在R(通过)中编写代码。我使用的步骤通常是: ssh -Y login@remote.server screen -r my_R_work_session conda activate my_environment nvim code.r 然后键入\rf命令以在nvim内打开R终端 然后我就可以在R中绘制任何东西(例如,使用plot(iris))。绘图会在Mac
ssh -Y login@remote.server
screen -r my_R_work_session
conda activate my_environment
nvim code.r
然后键入\rf
命令以在nvim
内打开R终端
然后我就可以在R中绘制任何东西(例如,使用plot(iris)
)。绘图会在Mac电脑的外部窗口中弹出(通过X11
/XQuartz
)。它通常在开始时工作良好
ssh
连接保持),X11连接除外
此时,任何绘图(iris)
的输出将为:
Error in .External2(C_X11, d$display, d$width, d$height, d$pointsize, :
unable to start device X11cairo
In addition: Warning message:
In function (display = "", width, height, pointsize, gamma, bg, :
unable to open connection to X11 display ''
屏幕
会话可以工作,但我仍然需要重新加载conda
和我的R
会话。但这很费时(也很烦人),我想可能有更好的解决方案
功能()
在失去X11连接之前,capabilities()
的输出为:
jpeg png tiff tcltk X11 aqua
TRUE TRUE TRUE TRUE TRUE FALSE
http/ftp sockets libxml fifo cledit iconv
TRUE TRUE TRUE TRUE TRUE TRUE
NLS profmem cairo ICU long.double libcurl
TRUE TRUE TRUE TRUE TRUE TRUE
失去X11连接后,唯一的区别是X11
设置为FALSE
-检查显示
关于,我检查了DISPLAY
,但似乎一切正常。
终端中(启动R之前或R运行时):
在R中:
我尝试设置Sys.setenv(“DISPLAY”=“:0.0”)
,但没有任何区别
-X11SelocalHost
建议在/etc/ssh/sshd_config
中将X11UseLocalhost no
更改为X11UseLocalhost yes
,但这对我没有任何影响
-Xpra
最后,我尝试使用Xpra
,遵循来自(可能是最有希望的一个)的建议,但也没有任何区别。虽然在这里我不确定我是否正确使用它。以下是我所做的:
[local] ssh -Y login@remote.server
[remote] screen -r xpra
[remote] xpra start :10
# exit screen
[local] xpra attach ssh:remote.server:10
[remote] screen -r my_R_work_session
[remote] conda activate my_environment
[remote] nvim code.r
非常感谢您的评论和帮助 对于任何偶然看到这篇文章的人,我最终找到了一个超级简单的解决方案:您只需要在当前会话的同时启动一个新的ssh-Y
连接。然后,您可以将当前会话中的DISPLAY
参数重定向到新连接中的值
下面是一个更详细的例子。
在当前会话中(启动新ssh连接之前),如果您在R
终端中尝试:
> capabilites() # returns X11 = FALSE
> Sys.getenv('DISPLAY') # returns localhost:xx.0
localhost:12.0
> x11('localhost:12.0') # returns error message
现在您可以并行启动新的ssh连接:ssh-Ylogin@remote.server
。您需要在此新会话中找到DISPLAY
的值,例如:
在bash中:
$ echo $DISPLAY
localhost:13.0
或在R中:
> Sys.getenv('DISPLAY')
localhost:13.0
最后,在原始R终端中,将显示
参数设置为新的连接值:
> Sys.setenv('DISPLAY' = 'localhost:13.0')
> x11('localhost:13.0') # or x11() - both should work
还有另一个选项,即修改ssh配置文件(~/.ssh/config
)中的ForwardX11Timeout
的值。默认情况下,它通常设置为~20分钟(请参见manssh
)。您可以尝试将此设置为一天(或更多),例如:ForwardX11Timeout 1d
。这将防止X11
在任何工作会话期间停止,如果其打开时间少于24小时。您甚至可以在此配置文件中设置ForwardX11Trusted yes
。但是,这些选项可能导致安全漏洞,因此需要谨慎考虑
> Sys.getenv('DISPLAY')
localhost:13.0
> Sys.setenv('DISPLAY' = 'localhost:13.0')
> x11('localhost:13.0') # or x11() - both should work