tmux
セッションをローカルで開始して開いたままにすると、リモートでsshを実行して、newtmux
セッションを開始します(古いものに接続せず、新しいセッションをスパンキングするブランド)X11転送が壊れているようです。私は thisscreen
の同様の問題の回避策を試しましたが、役に立ちませんでした...
GUIアプリ(xeyes
など)を起動しようとしたときのエラーメッセージは、can't open display: wrong authentication
の影響を受けます。キャリッジリターンを出力し、エラーメッセージの一部を新しいもので上書きしているように見えるので、実際にはそれが何であるかはわかりません...
今のところ、新しいリモートセッションを開始する前に、ローカルで開始したすべてのtmuxセッションを確認して手動で閉じます。ローカル/リモートの混合tmux
セッションでX11転送を機能させる方法はありますか?
100%うまくいくかどうかはわかりませんが、そのリンクは私にとっても機能しませんでした。最初のターミナルからDISPLAY変数をコピーして、正常に機能するexport DISPLAY=${copied from outside tmux}
を記述しました。
log in ...
echo $DISPLAY # remember this
tmux a
export DISPLAY=${variable from memory}
そのリンクからの関数は私に機能しなかった完全に異なるDISPLAYを与えました
私も同様の問題を抱えていました。私の状況では、DISPLAY
を設定するだけでは不十分でした。デフォルトでは、新しいセッションだけでなく、tmuxサーバーの起動時(最初のセッションの開始時)に一部の環境が設定されます。以下は私にとってはうまくいきますが、それが最適だとは思えません。
.tmux.conf
で、外部環境から保持したい変数をtmuxに記憶させます。ローカルでGnomeTerminalを使用する場合と、リモートで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
の一部を読み直すまで、私はそれについて知りませんでした。
それでも、既存のセッションを使用している場合は、デタッチと再アタッチが必要になることがあります。以前よりもはるかに迷惑ではありませんが。
完全な開示:precmd
およびpreexec
フックでtmux show-environment
を使用するというアイデアは私自身のものではありませんでしたが、どこで見たか忘れています。どこに書いても、それを書いた人に感謝します。