我正在尝试在终端窗口中远程运行 IDL。我想从远程生成 png 文件中的图像,而不在终端中显示弹出窗口(由于某些原因,我不知道弹出窗口图在我的计算机中不能正常工作)。我一直在使用 ssh -X 和 ssh -Y 并收到相同的错误。脚本如下
set_plot,'ps'
device,/color,bits=8,xs=80,ys=60
device,filename=‘test.eps'
loadct, 4
!p.charsize = 1.2
!p.color = 120
lfile = FILE_LINES(filename1)
openr,1,filename1
ar1=fltarr(6,lfile)
readf,1,ar1
close,1
Xcoord=ar1[0,*]
Ycoord=ar1[1,*]
h2d=hist_2d(Xcoord,Ycoord,bin1=5, bin2=5)
h2d = CONGRID(h2d, MAX(Xcoord), MAX(Ycoord))
g0=image(h2d)
device,/close
end
当我通过启动此 script.pro 时,我在下面复制的.r script
行中收到错误 g0=image(h2d)
% Compiled module: $MAIN$.
% LOADCT: Loading table BLUE/GREEN/RED/YELLOW
% Compiled module: HIST_2D.
Invalid MIT-MAGIC-COOKIE-1 key% WIDGET_CONTROL: Unable to connect to X Windows display: localhost:11.0
% IMAGE: WIDGET_CONTROL: Unable to establish X Connection.
% Execution halted at: $MAIN$ 42 /home/script.pro
我相信这条线
%Invalid MIT-MAGIC-COOKIE-1 key% WIDGET_CONTROL: Unable to connect to X Windows display: localhost:11.0
所指向的问题与该线所指向的问题不同
% IMAGE: WIDGET_CONTROL: Unable to establish X Connection
。
遵循(类似的 Stackexchange 问题)[https://unix.stackexchange.com/questions/199891/invalid-mit-magic-cookie-1-key-when-trying-to-run-program-remotely] 的建议,我尝试按照以下方式进行故障排除,但尚未解决问题:
- DISPLAY 环境变量似乎设置正确:
env | grep DISPLAY
给出DISPLAY=localhost:11.0
- 该行
export DISPLAY=desktop:0.
给出错误export: Command not found
。 - 运行之前的行
xhost +local:
给出了Invalid MIT-MAGIC-COOKIE-1 keyxhost: unable to open display "localhost:11.0
. - 我也尝试过
ps aux | grep bin/X | grep -v grep
并收到
root 1745 0.0 0.1 323536 22172 tty1 Ssl+ Feb06 1:43 /usr/bin/X :0 -background none -noreset -audit 4 -verbose -auth /run/gdm/auth-for-gdm-DUUgHB/database -seat seat0 -nolisten tcp vt1
- 我也尝试过
ps aux | grep /Xorg | grep -v grep
并收到
root 758 0.0 0.0 225860 2872 ? Ss Feb06 0:00 /usr/bin/abrt-watch-log -F Backtrace /var/log/Xorg.0.log -- /usr/bin/abrt-dump-xorg -xD
当我尝试从另一台计算机运行相同的脚本(通过终端窗口再次连接到同一台远程计算机)时,我没有收到该行
%Invalid MIT-MAGIC-COOKIE-1 key% WIDGET_CONTROL: Unable to connect to X Windows display: localhost:11.0
,但仍然收到% IMAGE: WIDGET_CONTROL: Unable to establish X Connection
.
所以我认为这MIT-MAGIC
条线是我的计算机的可视化问题,但widget_control
无论如何我无法调试该错误。如果我至少能解决小部件问题,我也许可以在另一台机器上生成绘图。谢谢。
非常感谢您的详尽解释,telcoM。现在我更清楚了一些事情。我已在 Mac 上重新安装了 XQuartz(XQuartz 2.7.11)。 MIT-MAGIC-COOKIE 上的错误似乎已经消失,但我使用相同的脚本收到一个与 IDL 库相关的错误(我认为执行在与之前相同的行,即 image 命令):
% Compiled module: $MAIN$.
% LOADCT: Loading table BLUE/GREEN/RED/YELLOW
% Compiled module: HIST_2D.
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
% Loaded DLM: PNG.
% WIDGET_EVENT: Failure to acquire window rendering context.
% IMAGE: WIDGET_EVENT: Unable to acquire device context.
% Execution halted at: $MAIN$
Idl 弹出窗口打开(黑色),保存的文件 (45 kb) 是一个(空白)页面。谷歌搜索让我找到了https://www.l3harrisgeospatial.com/Support/Forums/aft/4922但我无法访问 IDL 库。我应该要求系统管理员更改 IDL 首选项吗?
答案1
为了能够显示 X11 图形,Mac 需要有X石英安装。这是X11显示服务器:有效地,本地和远程 X11 应用程序可以在其上绘制其显示窗口的画布。 Apple 已对其进行了设置,以便 Mac SSH 将设置 X11 转发,并且如果 XQuartz 在需要时尚未运行,则通常会自动启动。
XQuartz 曾经是 MacOS 的一部分,但现在是一个单独的开源项目。
当建立具有 X11 转发的 SSH 连接时,远程端应该发生两件事:
- 远程
sshd
将设置一个 X11 代理(通常只允许本地连接)到第一个空闲 TCP 端口号 6010 或以上,并将 DISPLAY 变量设置为localhost:<port number - 6000>
。这告诉远程 X11 应用程序在哪里可以找到与实际显示器的连接。 - 远程
sshd
将生成一个 MIT-MAGIC-COOKIE 供 X11 应用程序使用,并将其放置到一个文件中以允许客户端使用它(通常通过xauth
在远程系统上使用命令)。该文件的默认路径是~/.Xauthority
,但如果将完整路径名也设置到XAUTHORITY
环境变量中,则可以使用自定义路径。如果 X11 客户端无法找到或访问此文件,它将无法连接。为每个连接生成一个新的 cookie:旧的 cookie 文件将不起作用。
在没有 XQuartz 的 Mac 系统上,可能会出现此类问题,其中 X11 应用程序的错误消息可能有点误导。应用程序已读取 DISPLAY 变量并根据该变量的值成功连接到本地 TCP 端口 6011,并找到 Xauthority 文件并将 cookie 呈现给它认为是真正的 X11 显示服务器(但实际上是远程sshd
的X11 转发代理)。此时,远程端sshd
通过加密隧道将第一个 X11 请求转发到本地系统,本地端发现实际的 XQuartz 显示服务器...不在那里。
X11 协议没有错误代码可以有效地表示“抱歉,我不是实际的服务器;我只是一个代理,一个中间人。实际的服务器似乎没有响应。”由于第一次尝试使用 cookie 时会检测到错误,Invalid MIT-MAGIC-COOKIE
因此会生成一条通用错误消息。
关于一些故障排除步骤:
行
export DISPLAY=desktop:0
。给出错误export: Command not found
这表明为远程用户帐户配置的 shell 可能不是使用 POSIXsh
语法的 shell。但是以这种方式设置 DISPLAY 环境变量意味着跳过 SSH 隧道并告诉 X11 应用程序在主机上的端口 6000 中与 X11 显示服务器建立直接的未加密 TCP 连接desktop
。这不安全许多现代 X11 显示服务器根本不会侦听 TCP 连接,或者至少只会侦听来自本地系统的连接。通过采取特殊步骤,可以使这种不安全的遗留方法发挥作用,但是你不想那样做。
运行之前的行
xhost +local:
给出了Invalid MIT-MAGIC-COOKIE-1 keyxhost: unable to open display "localhost:11.0
.
xhost
仅当您已与 X11 显示服务器建立有效连接时才能使用该命令。它可以用于为一个用户“打开一扇门”,让其他用户连接到同一台显示器,如果您需要在运行 GUI 程序之前在远程主机上使用su
或sudo
切换到另一个用户帐户,这可能很有用,但它允许每个人谁可以访问环境变量标识的端口/套接字DISPLAY
来访问您的显示服务器。除非绝对必要,否则你不想这样做,如果您一开始就没有有效的 X11 显示连接,那么这对您根本没有帮助。
我也尝试过
ps aux | grep bin/X | grep -v grep
这表明有一个 X11 显示服务器正在为远程系统运行自己的显示 - 远程 X11 应用程序不需要将其显示给您。如果您有使用它的授权,您的图像窗口将弹出到远程计算机的显示屏,可能离您太远而无用。