リモート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)インタラクティブメニューでこのプロパティを変更します。

関連情報