X11 转发不适用于多个 tmux 会话

mga*_*lgs 10 linux ssh x11-forwarding tmux

如果我tmux在本地启动一个会话并保持打开状态,然后远程 ssh 进入并启动一个 tmux会话(不附加到旧会话,一个品牌打新会话)X11 转发似乎中断。我已经为类似的问题尝试了这种解决方法,screen但无济于事......

当我尝试启动 GUI 应用程序(如xeyes)时的错误消息与can't open display: wrong authentication. 我实际上不确定它是什么,因为它似乎正在输出回车符并用新的错误消息覆盖部分错误消息......

现在,在开始新的远程会话之前,我只是通过并手动关闭我在本地启动的所有 tmux 会话。有没有办法让 X11 转发与本地/远程混合tmux会话一起工作?

小智 13

不是 100% 确定它对你有用,但那个链接对我也不起作用,我只是从初始终端复制了 DISPLAY 变量并写了export DISPLAY=${copied from outside tmux}它工作正常 - 即

log in ...
echo $DISPLAY # remember this
tmux a
export DISPLAY=${variable from memory}
Run Code Online (Sandbox Code Playgroud)

该链接中的功能给了我一个完全不同的 DISPLAY,但它不起作用


jak*_*kar 5

我有类似的问题。在我的情况下,设置DISPLAY还不够。默认情况下,一些环境是在启动 tmux 服务器时(启动第一个会话时)设置的,而不仅仅是任何新会话。以下内容对我有用,但我怀疑它是否是最佳的。

在 中.tmux.conf,让 tmux 记住您想要保留的外部环境变量。我使用的本地使用 Gnome 终端和远程使用 Terminal.app 之间存在差异。其中一些可能不是必需的,但我不确定是哪一个。该-g标志可能不正确。

set -g update-environment "\
  CLUTTER_IM_MODULE \
  DBUS_SESSION_BUS_ADDRESS \
  DBUS_SESSION_BUS_ADDRESS \
  DEFAULTS_PATH \
  DESKTOP_AUTOSTART_ID \
  DESKTOP_SESSION \
  DISPLAY \
  GDMSESSION \
  GNOME_DESKTOP_SESSION_ID \
  GPG_AGENT_INFO \
  GTK_IM_MODULE \
  GTK_MODULES \
  SESSION_MANAGER \
  SSH_AGENT_PID \
  SSH_ASKPASS \
  SSH_AUTH_SOCK \
  SSH_CONNECTION \
  WINDOWID \
  WINDOWPATH \
  XAUTHORITY \
  XDG_CONFIG_DIRS \
  XDG_CURRENT_DESKTOP \
  XDG_DATA_DIRS \
  XDG_MENU_PREFIX \
  XDG_RUNTIME_DIR \
  XDG_SEAT \
  XDG_SESSION_DESKTOP \
  XDG_SESSION_ID \
  XDG_SESSION_TYPE \
  XDG_VTNR \
  XMODIFIERS \
  "
Run Code Online (Sandbox Code Playgroud)

尽管名称为“更新环境”,但该设置似乎并没有真正改变环境。但是,您可以使用 检索它tmux show-environment。所以我用它来更新我的环境.zshrc

zshrc_restore_x11_vars()
{
  if [[ -z $TMUX ]]
  then
    return 0
  fi

  local tmux_env="$(tmux show-environment)"

  for var_line in ${(f)tmux_env}
  do
    if [[ $var_line == -[A-Za-z_]* ]]
    then
      local var=${var_line#-}
      unset $var

    elif [[ $var_line == [A-Za-z_]*'='* ]]
    then
      export $var_line

    fi
  done
}

precmd()
{
  zshrc_restore_x11_vars
}

preexec()
{
  zshrc_restore_x11_vars
}
Run Code Online (Sandbox Code Playgroud)

使用tmux show-environment -s可能会更好。man tmux但直到我重新阅读部分内容并写下这个答案时我才知道这一点。

不过,在使用现有会话时,有时我必须分离并重新连接。虽然它比以前不那么烦人了。

tmux show-environment完全披露:在precmdand钩子中使用的想法preexec不是我自己的,但我忘记了我在哪里看到的。谢谢你,无论是谁写的,无论你在哪里写的。