ググるとOSC52というものが出てきた。
OSC52って何ぞや
クリップボードを操作するエスケープシーケンスらしい。
こんな丁寧な解説があったので読むとこんな感じか。
文字 | 意味 |
---|---|
\033 | エスケープシーケンスの開始 |
52 | OSC52グループのエスケープシーケンスだよ |
; | 区切り |
c | クリップボードへコピーしてくれ |
; | 区切り |
文字列 | クリップボードへコピーする文字をBASE64にしたもの |
\a | エスケープシーケンスの終わり |
試しにssh先でこれをやってみるとローカルのクリップボードへ"HELLO, world"が入った。すげぇ。
(後に書くようにターミナルエミュレータへ設定が必要)
printf "\033]52;c;%s\a" $(echo "HELLO, world" | base64)
もっと簡単にやりたい
なんかスクリプト書くかと思ったら、なんと良いのがchromiumのリポジトリ内にあった。 https://chromium.googlesource.com/apps/libapps/+/master/hterm/etc/osc52.sh
githubのミラーはこちら https://raw.githubusercontent.com/libapps/libapps-mirror/main/hterm/etc/osc52.sh
なのでこういう感じで楽に設定できる
curl -L https://raw.githubusercontent.com/libapps/libapps-mirror/main/hterm/etc/osc52.sh -o osc52.sh
chmod +x osc52.sh
sudo mv osc52.sh /usr/local/bin
するとこんな感じにできる
echo 'HELLO' | osc52.sh # これでクリップボードへコピーされる
OSC52を許可するのはセキュリティリスクの懸念で、デフォルトでは無効になっている端末エミュレータが多いらしい。
(リモート先に悪意があるとクリップボードを簡単にいじれちゃうから?具体的な攻撃方法とかは調べたけどわからん。一応気を付けたほうがいいのかな)
git bash(mintty)で使うには設定が必要。
.minttyrcに以下を書く。
AllowSetSelection=yes
windows terminalだと設定不要っぽい。
tmux実行中でも動いた。screenもコード読む限り通りそう。というかコードがきれい。
余談だけど
ここを見るとvimとemacsのスクリプトもある。
https://chromium.googlesource.com/apps/libapps/+/master/hterm/etc