VPS に ssh で接続し、tmux を実行します。マウスと Shift キーを使用して、リモートからローカル、ローカルからリモートにコピー/貼り付けできます。
でもコピーの仕方が分からない大量のテキスト。
ローカルで作業している場合は、次のようにするcat somefile.txt | xsel -b
かcat somefile | xclip -selection clipboard
、クリップボードにコピーします。(リモート サーバーは x を実行していないため、もちろんこれを行うことはできません。また、クリップボードは tmux で使用されるものと一致しません。)
では、tmux セッションでテキストをコピーし、それをネットワーク経由でローカル システムのクリップボードに複製するにはどうすればよいでしょうか?
更新:
実際、これは tmux がなくても適用できます - リモート シェルとローカル シェルの間で大きなバッファーをコピー アンド ペーストする方法。
答え1
双方向クリップボード(詳細)ここ):
以上です。次に、リモート ホストでリモート → ローカル実行をテストします。
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
サーバー上。xsel
libx11-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)対話型メニューからこのプロパティを変更します。