Le transfert X11 ne fonctionne pas avec plusieurs sessions tmux

9

Si je démarre une tmuxsession localement et la laisse ouverte, puis ssh à distance et démarre une nouvelle tmux session (ne pas attacher à l'ancienne, une nouvelle session fessée) Le transfert X11 semble rompre. J'ai essayé cette solution de contournement pour un problème similaire avec screenmais en vain ...

Le message d'erreur lorsque j'essaie de lancer une application graphique (comme xeyes) est quelque chose à l'effet de can't open display: wrong authentication. En fait, je ne sais pas de quoi il s'agit, car il semble qu'il génère un retour chariot et écrase une partie du message d'erreur par un nouveau ...

Pour l'instant, je viens de parcourir et de fermer manuellement toutes les sessions tmux que j'avais démarrées localement avant de démarrer ma nouvelle session à distance. Existe-t-il un moyen de faire fonctionner le transfert X11 avec des tmuxsessions mixtes locales / distantes ?

mgalgs
la source

Réponses:

12

Je ne suis pas sûr à 100% que cela fonctionnera pour vous, mais ce lien ne fonctionnait pas non plus pour moi et je viens de copier la variable DISPLAY à partir du terminal initial et d'écrire export DISPLAY=${copied from outside tmux}ce qui fonctionnait bien - c'est-à-dire

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

la fonction de ce lien m'a donné un AFFICHAGE complètement différent qui ne fonctionnait pas

Pomme
la source
Échec toujours en raison d'une "mauvaise authentification"
mgalgs
merci, cela m'a permis d'ouvrir des fichiers PDF à partir de tmux avec xdg-open file.pdf
pascalwhoop
Avez-vous essayé ssh -Yau lieu de ssh -X?
feedMe
3

J'avais un problème similaire. Dans ma situation, le réglage DISPLAYn'était pas suffisant. Par défaut, une partie de l'environnement est définie lors du démarrage du serveur tmux (lors du démarrage de la première session), et pas n'importe quelle nouvelle session. Ce qui suit fonctionne pour moi, mais je doute qu'il soit optimal.

Dans .tmux.conf, faites en sorte que tmux se souvienne des variables que vous souhaitez conserver de l'environnement extérieur. J'ai utilisé ceux qui différaient localement en utilisant Gnome Terminal et à distance en utilisant Terminal.app. Certains d'entre eux ne sont probablement pas nécessaires, mais je ne sais pas lequel. Le -gdrapeau n'est peut-être pas correct.

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 \
  "

Malgré le nom "update-environment", le paramètre ne semble pas réellement changer l'environnement. Vous pouvez cependant le récupérer à l'aide de tmux show-environment. Je l'ai donc utilisé pour mettre à jour l'environnement dans mon .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
}

Utiliser tmux show-environment -saurait probablement été mieux. Mais je ne savais pas cela avant d'avoir relu une partie de man tmuxpour écrire cette réponse.

Pourtant, je dois parfois détacher et rattacher, lorsque j'utilise une session existante. Bien que ce soit beaucoup moins ennuyeux qu'auparavant.

Divulgation complète: L'idée d'utiliser tmux show-environmentdans les crochets precmdet preexecn'était pas la mienne, mais j'oublie où je l'ai vue. Merci à celui qui l'a écrit, où que vous l'ayez écrit.

jakar
la source
A fonctionné pour moi sans le script shell. Merci beaucoup.
wbg