在 GDM 和 SSH 之间协调 .Xauthority

Mad*_*ist 5 ssh emacsclient x11-forwarding emacs-server gdm

我遇到了一个问题,如果我在远程系统上以守护进程模式启动 Emacs,然后在我的本地系统中运行ssh remotehost emacsclient -c,它会失败,并且由于身份验证错误而导致 X11 连接被拒绝。 然而,诸如此类的事情ssh remotehost xterm工作正常,所以它与 ssh 连接、X 转发等无关。

有问题的两个系统都运行 Ubuntu 18.04 LTS。

可以猜到,问题是 xauth,特别是在阅读了 2010/2011 年提交的问题后,这似乎是由于 GDM 将环境XAUTHORITY变量设置为$XDG_RUNTIME_DIR/gdm/Xauthority(类似于/run/user/1000/gdm/Xauthority)的方式,而传入的 SSH 连接则不然XAUTHORITY在为 SSH 会话设置 xauth cookies 之前设置。

这意味着 ssh xauth cookie 将添加到默认$HOME/.Xauthority文件中。我的 Emacs 守护进程无法看到这些 cookie,因为它正在使用 GDM$XDG_RUNTIME_DIR/gdm/Xauthority文件。

正如我所说,这种差异似乎已经是一个已知问题 8 年多了……没有人解决它吗?疯狂的。我已经编写了一个安装 cookie 的脚本,但必须这样做是相当恶心的。

有没有办法让我的 ssh 会话使用 GDM Xauthority 文件?我已经尝试XAUTHORITY在 shell 设置中进行设置,但显然设置得太晚了,在 SSH 守护程序配置新的 Xauth cookie 之后,因为它仍然放入$HOME/.Xauthority.

Eli*_*lay 0

确实很难猜出X文件在哪里。就我而言,我最终破解了一些 shell 的东西来将其作为包装器的一部分emacsclient。相关位是:

fix_xauth() (
  if [[ -z "$XDG_RUNTIME_DIR" ]]; then return; fi
  if [[ ! -e "$HOME/.Xauthority" ]]; then return; fi
  shopt -s nullglob; shopt -u failglob
  for xauth in "$XDG_RUNTIME_DIR/"{".mutter-Xwaylandauth"*,"gdm/Xauthority"}; do
    if [[ ! -f "$xauth" ]]; then continue; fi
    xauth -f "$xauth" merge "$HOME/.Xauthority"
  done
)
Run Code Online (Sandbox Code Playgroud)