원격 tmux에서 로컬 x 클립보드로 텍스트 복사

원격 tmux에서 로컬 x 클립보드로 텍스트 복사

VPS에 SSH로 접속하고 tmux를 실행합니다. 마우스와 Shift를 사용하여 원격에서 로컬로, 로컬에서 원격으로 복사/붙여넣기를 할 수 있습니다.

그런데 복사하는 방법을 모르겠어요대량의 텍스트.

로컬에서 작업하는 경우 다음을 수행할 수 있습니다. cat somefile.txt | xsel -b또는 cat somefile | xclip -selection clipboard클립보드에 복사할 수도 있습니다. (물론 원격 서버가 x를 실행하지 않기 때문에 그렇게 할 수 없으며, 그럼에도 불구하고 클립보드는 tmux에서 사용되는 것과 일치하지 않습니다.)

그렇다면 tmux 세션에서 텍스트를 어떻게 복사하고, 이를 내 로컬 시스템의 클립보드에 복사하려면 어떻게 해야 할까요?

업데이트:
실제로 이것은 tmux 없이도 적용 가능합니다. 원격 쉘과 로컬 쉘 사이에 큰 버퍼를 복사하여 붙여넣는 방법입니다.

답변1

양방향 클립보드를 가지려면(자세히여기):

  1. 달리다ssh~와 함께-XX11 전달을 활성화합니다.

  2. 설치하다xsel(X 선택을 조작하십시오).

    sudo apt install xsel
    

그게 다야. 이제 원격 호스트에서 원격 → 로컬 실행을 테스트하려면 다음을 수행하십시오.

date +%Y-%m-%d_%T | xsel -b  # Or tee >(xsel -b) to send output also to stdout

로컬 호스트에서:

echo "Time on server is $(xsel -b)"

time텍스트를 클립보드에 복사하는 데 명령이 걸린 시간이 표시됩니다.

노트

  • 대신 기본 버퍼를 사용할 수도 있습니다.

    선택 옵션

    -p, --primary: PRIMARY 선택에 대해 작동합니다(기본값).
    -b, --clipboard: CLIPBOARD 선택으로 동작합니다.

  • tmux버퍼 스택어떤 경우에는 충분할 수도 있습니다.

  • -X필요로 할 수도있다xauth서버에서.

  • xsellibx11-6 및 libc6( apt depends xsel)에 따라 다릅니다.

  • xsel: Can't open display: (null)수표를 받으면이 답변.

답변2

위의 Pablo의 뛰어난 답변 외에도 DISPLAY클립보드용 X11 전달과 같은 난해한 작업을 수행하지만 OpenGL/CUDA 기계 학습 작업에는 로컬 디스플레이를 사용하는 경우 디스플레이를 리디렉션할 수 있습니다.

X11 전달 디스플레이를 별도의 환경 변수로 사이펀하면 두 세계의 "최고"를 얻을 수 있습니다.

다음과 같이 보일 수 있습니다.

# Bash function.
personal-ssh-session() {  # Call manually
    if [[ ! -v _SSH_DISPLAY && -v DISPLAY ]]; then
        export _SSH_DISPLAY=${DISPLAY}
        echo "Using redirect _SSH_DISPLAY=${_SSH_DISPLAY}"
    fi
    export DISPLAY=:1
}


# Bash script, `tmux-copy.sh`
#!/bin/bash
set -e
if [[ -n "${_SSH_DISPLAY}" ]]; then
    export DISPLAY=${_SSH_DISPLAY}
fi
mkdir -p ~/tmp
tee ~/tmp/tmux-clipboard.txt | xclip -in -selection clipboard


# tmux bind command - be sure ${_DOTFILES} is set, or use something else
bind -T copy-mode-vi Enter send-keys -X copy-pipe \
    '${_DOTFILES}/tmux-copy.sh'

https://github.com/eacousineau/dotfiles_template

  • X11-forward SSH 세션 내에서 실행:bash_aliases 기능
    • 이렇게 하면 DISPLAY가 로컬 gfx 카드와 X11 전달(대부분 소프트웨어 렌더링)을 사용하도록 설정됩니다.
  • 클립보드에 대한 리디렉션을 처리하는 스크립트를 추가합니다. 이는 또한 ~/tmp/tmux-clipboard.txt다음과 같은 경우에 현재 항목을 에 덤프합니다 .배쉬 스크립트
  • tmux에게 이 스크립트를 사용하라고 지시하세요:tmux 바인드 명령

답변3

이를 처리하는 일반적인 올바른 방법(터널링된 SSH를 통해서도 작동함, 예: 호스트 -ssh-> 서버 A -ssh-> 서버 B)은 OSC52 xterm 이스케이프 시퀀스를 사용하는 것입니다. 터미널이 OSC52 시퀀스 복사 버퍼를 광고하는 경우 앱(이 경우 tmux 또는 osc52 플러그인이 있는 neovim)은 OSC52 시퀀스 복사 버퍼를 내보내고 터미널이 자동으로 이를 로컬 호스트의 클립보드에 할당합니다. . 이 경우 이스케이프 시퀀스와 해당 페이로드는 SSH 세션을 통해 투명하게 이동합니다. 이스케이프 시퀀스는 버퍼의 내용이 터미널 출력을 복잡하게 만들거나 손상시키는 것을 방지합니다.

tmux의 맨페이지 문서를 참조하세요.

클립보드 설정 [설정 | 외부 | 끄다]

terminfo(5) 설명에 Ms 항목이 있는 경우 xterm(1) 이스케이프 시퀀스를 사용하여 터미널 클립보드 내용을 설정해 보십시오(TERMINFO EXTENSIONS 섹션 참조).

on으로 설정하면 tmux는 이스케이프 시퀀스를 수락하여 버퍼를 생성하고 터미널 클립보드 설정을 시도합니다. external로 설정하면 tmux는 터미널 클립보드 설정을 시도하지만 애플리케이션이 tmux 버퍼를 설정하려는 시도를 무시합니다. 꺼져 있으면 tmux는 클립보드 이스케이프 시퀀스를 허용하지도 않고 클립보드 설정을 시도하지도 않습니다.

이 기능은 자원을 설정하여 xterm(1)에서 활성화해야 합니다.

disallowedWindowOps: 20,21,SetXprop

또는 필요한 경우 xterm(1) 대화형 메뉴에서 이 속성을 변경합니다.

관련 정보