Carpe Diem

備忘録

tmuxでコピーモードを使った時にDeepLに渡されてしまう

背景

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 52Operating System Command 52の略で、ANSIエスケープシーケンスの一部です。
ANSIエスケープシーケンスは、テキストの色を変えたり、カーソルを動かしたりするためにターミナルで使われるコードです。
OSC 52はこれらのシーケンスの中でクリップボード操作に特化しています。

具体的にはOSC 52を使用するとターミナル内で以下のような操作を行えます。

OSC 52を使うことの利点はターミナルとGUIの間でテキストデータを簡単にやり取りできることです。
しかしセキュリティ上の懸念からすべてのターミナルエミュレータがこの機能をサポートしているわけではなく、デフォルトで無効になっていることもあります。

なぜOSC 52が機能していたか?

tmuxは以下の条件を満たしているとOSC 52が機能します。

  1. set-clipboardオプションがonまたはexternalであること
    • デフォルトはexternal
  2. TERM環境変数で指定したターミナルの terminfo に Ms capability が表示されていること
    • set -g default-terminal "tmux-256color"などを設定していると満たす
  3. 利用しているターミナルエミュレータ自身がOSC 52に対応していること
    • AlacrittyはOSC 52に対応。

ref: https://github.com/tmux/tmux/wiki/Clipboard#the-set-clipboard-option

1はデフォルト設定ですが、偶然もAlacrittyを使っていたり、その際にTrueColor対応のため上記設定を入れていたためOSC 52が意図せず機能していたようです。

christina04.hatenablog.com

解決方法

.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というものを知らず影響を受けていました。

同じ問題にぶつかった人の助けになれば幸いです。

参考