Пересылка X11 не работает с несколькими сеансами tmux

9

Если я запускаю tmuxсеанс локально и оставляю его открытым, затем запускаю ssh удаленно и начинаю новый tmux сеанс (не привязываясь к старому, совершенно новый сеанс) Переадресация X11 кажется прерванной. Я пробовал этот обходной путь для аналогичной проблемы, screenно безрезультатно ...

Сообщение об ошибке, когда я пытаюсь запустить приложение с графическим интерфейсом (например xeyes), является чем-то вроде эффекта can't open display: wrong authentication. Я на самом деле не знаю, что это такое, потому что кажется, что он выводит возврат каретки и перезаписывает часть сообщения об ошибке новым ...

Сейчас я просто прошёл и вручную закрыл все сеансы tmux, которые я начал локально, прежде чем начать мой новый удалённый сеанс. Есть ли способ заставить пересылку X11 работать со смешанными локальными / удаленными tmuxсеансами?

mgalgs
источник

Ответы:

12

Не уверен на 100%, что это сработает для вас, но эта ссылка у меня тоже не сработала, и я просто скопировал переменную DISPLAY из исходного терминала и написал, export DISPLAY=${copied from outside tmux}что работает нормально - т.е.

log in ...
echo $DISPLAY # remember this
tmux a
export DISPLAY=${variable from memory}

функция из этой ссылки дала мне совершенно другой дисплей, который не работал

яблоко
источник
Все еще не удалось из-за «неправильной аутентификации»
mgalgs
спасибо, это позволило мне открыть PDF-файлы из tmux с помощью xdg-open file.pdf
pascalwhoop
Ты пробовал ssh -Yвместо ssh -X?
FeedMe
3

У меня была аналогичная проблема. В моей ситуации настройки DISPLAYбыло недостаточно. По умолчанию часть среды задается при запуске сервера tmux (при запуске первого сеанса), а не только новый сеанс. Следующее работает для меня, но я сомневаюсь, что это оптимально.

В .tmux.confmake tmux запомните переменные, которые вы хотите сохранить от внешней среды. Я использовал те, которые отличались между локальным использованием Gnome Terminal и удаленным использованием 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 \
  "

Несмотря на название «update-environment», этот параметр, похоже, фактически не меняет среду. Вы можете, однако, получить его, используя 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
}

Использование, tmux show-environment -sвероятно, было бы лучше. Но я не знал об этом, пока не перечитал часть, man tmuxчтобы написать этот ответ.

Тем не менее, мне приходится иногда отсоединять и подключать при использовании существующего сеанса. Хотя это гораздо менее раздражает, чем раньше.

Полное раскрытие: Идея использования tmux show-environmentв precmdи preexecкрючками не был мой собственный, но я не помню , где я видел его. Спасибо, кто бы ни написал это, где бы вы ни написали это.

Джакар
источник
Работал у меня без сценария оболочки. Очень приятно, спасибо.
ГП