write ahead log

ロールフォワード用

ssh先からローカルのクリップボードへコピーしたい

ググると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