원격 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: 클립보드 선택에 대한 작업을 수행합니다.

  • 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 전달 SSH 세션 내에서 실행:bash_aliases 함수
    • 그러면 X11 포워딩(소프트웨어 렌더링일 가능성이 높음)과 함께 로컬 gfx 카드를 사용하도록 DISPLAY가 설정됩니다.
  • ~/tmp/tmux-clipboard.txt다음과 같은 경우에 클립보드 리디렉션을 처리하는 스크립트를 추가하면 현재 내용도 에 덤프됩니다 .배쉬 스크립트
  • tmux에게 이 스크립트를 사용하라고 지시하세요:tmux 바인딩 명령

답변3

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

tmux에 대한 맨페이지 문서를 참조하십시오.

클립보드 설정 [위 | 외부로 나가기 |

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

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

이 기능은 xterm(1)에서 자원을 설정하여 활성화해야 한다는 점에 유의하십시오.

disallowedWindowOps:20,21,SetXprop

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

관련 정보