如果我tmux
在本地启动一个会话并保持打开状态,然后远程 ssh 登录并启动新的 tmux
会话(不附加到旧会话,而是附加到全新会话)X11 转发似乎中断。我尝试过这解决类似问题screen
但无济于事......
当我尝试启动 GUI 应用程序(如xeyes
)时,错误消息类似于can't open display: wrong authentication
。我实际上不知道它是什么,因为它看起来像是输出回车符并用新消息覆盖部分错误消息...
现在,我只需手动关闭在启动新的远程会话之前在本地启动的所有 tmux 会话即可。有没有办法让 X11 转发与混合本地/远程tmux
会话一起工作?
答案1
不能 100% 确定它是否适合您,但该链接对我来说也不起作用,我只是从初始终端复制了 DISPLAY 变量并写入了export DISPLAY=${copied from outside tmux}
哪个工作正常 - 即
log in ...
echo $DISPLAY # remember this
tmux a
export DISPLAY=${variable from memory}
该链接中的功能给了我一个完全不同的显示,不起作用
答案2
我遇到了类似的问题。 在我的情况下,设置DISPLAY
还不够。 默认情况下,启动 tmux 服务器时(启动第一个会话时)会设置一些环境,而不仅仅是任何新会话。 以下方法对我有用,但我怀疑它是否是最佳的。
在 中.tmux.conf
,让 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
不是我自己的,但我忘了在哪里看到的。感谢写下这个想法的人,无论你在哪里写的。