リモート tmux からローカル x クリップボードにテキストをコピーする

リモート tmux からローカル x クリップボードにテキストをコピーする

VPS に ssh で接続し、tmux を実行します。マウスと Shift キーを使用して、リモートからローカル、ローカルからリモートにコピー/貼り付けできます。

でもコピーの仕方が分からない大量のテキスト

ローカルで作業している場合は、次のようにするcat somefile.txt | xsel -bcat 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 転送されたディスプレイを別の env 変数に転送すると、両方の長所を活かすことができます。

次のようになります:

# 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関数
    • これにより、DISPLAY は X11 転送ではなくローカル グラフィックス カードを使用するよう設定されます (おそらくソフトウェア レンダリング)
  • ~/tmp/tmux-clipboard.txtクリップボードのリダイレクトを処理するスクリプトを追加します。これにより、念のため、現在の内容も にダンプされます。bashスクリプト
  • tmux にこのスクリプトを使用するように指示します:tmux バインドコマンド

答え3

これを処理する一般的な正しい方法 (トンネル SSH でも機能します。例: ホスト -ssh-> サーバー A -ssh-> サーバー B) は、OSC52 xterm エスケープ シーケンスを使用することです。何が起こるかというと、ターミナルがそれをアドバタイズしている場合、アプリ (この場合は tmux または、たとえば osc52 プラグインを使用した neovim) が OSC52 シーケンス コピー バッファーを出力し、ターミナルはそれをローカル ホストのクリップボードに自動的に割り当てます。この場合、エスケープ シーケンスとそのペイロードは SSH セッションを通じて透過的に移動することに注意してください。エスケープ シーケンスは、バッファーの内容がどれだけ長くても、ターミナル出力が乱雑になったり破損したりしないようにします。

tmux のマニュアルページドキュメントを参照してください:

クリップボードの設定 [オン | 外部 | オフ]

terminfo(5) の説明に Ms エントリがある場合、xterm(1) エスケープ シーケンスを使用して端末のクリップボードの内容を設定しようとします (TERMINFO EXTENSIONS セクションを参照)。

オンに設定すると、tmux はバッファを作成するためのエスケープ シーケンスを受け入れ、ターミナル クリップボードの設定を試みます。外部に設定すると、tmux はターミナル クリップボードの設定を試みますが、アプリケーションによる tmux バッファの設定は無視します。オフに設定すると、tmux はクリップボード エスケープ シーケンスを受け入れず、クリップボードの設定も試みません。

この機能は、xterm(1) でリソースを設定して有効にする必要があることに注意してください。

許可されていないウィンドウ操作: 20,21,SetXprop

または、必要に応じてxterm(1)対話型メニューからこのプロパティを変更します。

関連情報