Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不退出远程服务器上的R的情况下恢复X11连接_R_Ssh_X11 Forwarding_Xquartz - Fatal编程技术网

如何在不退出远程服务器上的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

短版本:在远程计算机上工作时,如何从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电脑的外部窗口中弹出(通过
    X11
    /
    XQuartz
    )。它通常在开始时工作良好

  • 问题
  • 但是,在某个时刻,我可能会丢失与服务器的连接一秒钟(internet故障,vpn停止…),当我恢复与服务器的连接时,一切似乎都正常工作(主
    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 ''
    
  • 解决方案(但寻找更好的解决方案!)
  • 目前我找到的唯一解决方案是启动到服务器的新ssh连接,然后重新执行整个过程,直到启动R会话和绘图。有时,只关闭
    屏幕
    会话可以工作,但我仍然需要重新加载
    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