背景
tmuxでコピーモードで範囲選択によるコピー機能をよく使っていますが、そこでコピーしたものがそのままDeepLの翻訳の方へ渡されてしまう問題に悩まされてました。
今は有料版なのでコピーしたものが学習データに使われることはありませんが、偶にDeepLのアプデで?ログアウトされてしまっていることがあります。
そうなると無料版状態となり学習データに使われてしまい、情報漏洩に繋がるので解決したかったのがきっかけです。
環境
- tmux v3.3a
- Alacritty 0.13.1
- macOS 13.6
一般的にコピーモードの値がクリップボードに渡されるように次の設定を.tmux.conf
に入れています。
# コピーモード完了時にクリップボードにコピー set-window-option -g mode-keys vi bind-key -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "pbcopy"
事象
このようにtmuxで範囲選択コピーを行うと、
勝手にDeepLにコピーした内容が渡されてしまいます。
原因
tmuxのクリップボード連携方法には以下の2種類があります。
OSC 52
を使うcopy-pipe
を使う
今回はOSC 52
によってクリップボードに渡されて自動的にDeepLが翻訳してしまっていたようです。
OSC 52とは
OSC 52
はOperating System Command 52の略で、ANSIエスケープシーケンスの一部です。
ANSIエスケープシーケンスは、テキストの色を変えたり、カーソルを動かしたりするためにターミナルで使われるコードです。
OSC 52
はこれらのシーケンスの中でクリップボード操作に特化しています。
具体的にはOSC 52
を使用するとターミナル内で以下のような操作を行えます。
OSC 52
を使うことの利点はターミナルとGUIの間でテキストデータを簡単にやり取りできることです。
しかしセキュリティ上の懸念からすべてのターミナルエミュレータがこの機能をサポートしているわけではなく、デフォルトで無効になっていることもあります。
なぜOSC 52が機能していたか?
tmuxは以下の条件を満たしているとOSC 52
が機能します。
set-clipboard
オプションがon
またはexternal
であること- デフォルトは
external
- デフォルトは
TERM
環境変数で指定したターミナルの terminfo にMs
capability が表示されていることset -g default-terminal "tmux-256color"
などを設定していると満たす
- 利用しているターミナルエミュレータ自身が
OSC 52
に対応していること- Alacrittyは
OSC 52
に対応。
- Alacrittyは
ref: https://github.com/tmux/tmux/wiki/Clipboard#the-set-clipboard-option
1はデフォルト設定ですが、偶然もAlacrittyを使っていたり、その際にTrueColor対応のため上記設定を入れていたためOSC 52
が意図せず機能していたようです。
解決方法
.tmux.conf
に以下の設定を追加してset-clipboard
を無効化しOSC 52
が働かないようにします。
set -s set-clipboard off
before
# コピーモード完了時にクリップボードにコピー set-window-option -g mode-keys vi bind-key -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "pbcopy"
after
# コピーモード完了時にクリップボードにコピー set -s set-clipboard off set-window-option -g mode-keys vi bind-key -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "pbcopy"
まとめ
tmuxでのクリップボード連携方法でよくある設定だけしか気にしたことがなかったので、OSC 52
というものを知らず影響を受けていました。
同じ問題にぶつかった人の助けになれば幸いです。