X11転送は複数のtmuxセッションでは機能しません


9

tmuxローカルでセッションを開始して開いたままにしておくと、リモートでsshを実行して新しい tmuxセッションを開始します(古いセッションに接続せず、ブランドスパンキングの新しいセッション)X11転送が失敗するようです。私は同様の問題でこの回避策を試しましscreenたが、役に立ちません...

GUIアプリケーション(などxeyes)を起動しようとすると、エラーメッセージがの影響を受けcan't open display: wrong authenticationます。キャリッジリターンを出力し、エラーメッセージの一部を新しいもので上書きしているように見えるので、実際にはそれが何であるかはわかりません...

ここでは、新しいリモートセッションを開始する前に、ローカルで開始したすべてのtmuxセッションを通過して手動で閉じます。ローカルとリモートの混合tmuxセッションでX11転送を機能させる方法はありますか?

回答:


12

100%確実に機能するかどうかはわかりませんが、そのリンクも機能しませんでした。最初のターミナルからDISPLAY変数をコピーして、export DISPLAY=${copied from outside tmux}正常に機能するものを書きました。

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

そのリンクからの関数は私に全く違うDISPLAYを与えましたが機能しませんでした


「間違った認証」が原因で依然として失敗する
mgalgs 2013

おかげで、これにより、xdg-open file.pdfを使用してtmuxからPDFを開くことができました
pascalwhoop

ssh -Y代わりに試しましたssh -Xか?
feedMe 2018

3

同様の問題がありました。私の状況では、設定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 \
  "

「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この答えを書くためにの一部を読み直すまで、私はそれについて知りませんでした。

それでも、既存のセッションを使用するときは、デタッチして再アタッチする必要がある場合があります。以前よりずっと面倒ではありませんが。

完全な開示:and フックで使用tmux show-environmentするという考えは私自身のものではありませんでしたが、どこで見たか忘れてしまいました。どこに書いても、それを書いた人に感謝します。precmdpreexec


シェルスクリプトなしで私のために働いた。大変感謝しております。
wbg
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.