X11 전달은 여러 tmux 세션에서 작동하지 않습니다


9

tmux세션을 로컬로 시작하고 열린 상태로두면 원격으로 ssh를 시작하고 tmux 세션을 시작 하지 않고 세션을 시작하는 세션을 시작합니다 . X11 전달이 중단 된 것 같습니다. 비슷한 문제 로이 해결 방법을 시도 screen했지만 아무 소용이 없습니다 ...

GUI 앱 (예 :)을 시작하려고 할 때 발생하는 오류 메시지 xeyes는 영향을 미칩니다 can't open display: wrong authentication. 실제로 캐리지 리턴을 출력하고 오류 메시지의 일부를 새로운 것으로 덮어 쓰는 것처럼 보이기 때문에 실제로 그것이 무엇인지 알지 못합니다 ...

지금은 새 원격 세션을 시작하기 전에 로컬에서 시작한 모든 tmux 세션을 수동으로 종료했습니다. X11 포워딩을 혼합 로컬 / 원격 tmux세션으로 작업 할 수있는 방법이 있습니까?

답변:


12

100 % 확실하지는 않지만 링크가 저에게도 효과가 없으며 초기 터미널에서 DISPLAY 변수를 복사하여 export DISPLAY=${copied from outside tmux}잘 작동했습니다.

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

해당 링크의 기능으로 인해 전혀 다른 DISPLAY가 작동하지 않았습니다.


"잘못된 인증"으로 인해 여전히 실패
mgalgs

덕분에 xdg-open file.pdf를 사용하여 tmux에서 pdf를 열 수있었습니다.
pascalwhoop

ssh -Y대신에 시도 했습니까 ssh -X?
feedMe

3

나는 비슷한 문제가 있었다. 제 상황에서는 설정 DISPLAY이 충분하지 않았습니다. 기본적으로 일부 환경은 새 세션뿐만 아니라 tmux 서버를 시작할 때 (첫 번째 세션을 시작할 때) 설정됩니다. 다음은 나를 위해 작동하지만 그것이 최적인지 의심합니다.

에서 .tmux.conftmux가 외부 환경에서 유지하려는 변수를 기억하게하십시오. 로컬에서 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-environmentprecmdpreexec후크 내 자신의 아니었지만, 나는 그것을보고 어디 잊어 버려. 당신이 그것을 쓴 곳, 누구 에게든 감사합니다.


쉘 스크립트없이 나를 위해 일했습니다. 매우 감사합니다.
wbg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.