「xclip」や「xsel」などのコマンドライン クリップボード ツールは、クリップボードを保持しない X ウィンドウ環境で、どのようにしてクリップボードを保持するのでしょうか。

「xclip」や「xsel」などのコマンドライン クリップボード ツールは、クリップボードを保持しない X ウィンドウ環境で、どのようにしてクリップボードを保持するのでしょうか。

この質問を読んだ後vim を終了すると X クリップボードがクリアされるX ウィンドウのクリップボードは、選択内容が取得されたプログラムが開いている間だけ存在することがわかりました。
この動作のため、「glipper」や「parcellite」などのプログラムが存在します。

プログラムが終了するたびに X クリップボードがクリアされる場合、プログラムはどのように動作し、どのようにxclipなるのでしょうかxsel
また、このようなプログラムを使用することでセキュリティ上どのような影響があるのでしょうか。たとえば、パスワードがクリップボードにコピーされた場合、このパスワードはプログラムやユーザーがアクセスできる一時ファイルに保存される可能性がありますか。

答え1

xclipboard、 ...などのクリップボード アプリケーションがclipit選択内容を盗み取らない限り、xsel/ はxclip選択内容を所有している限り、将来の選択要求を処理するためにバックグラウンド プロセスをフォークします。

$ printf test | xclip
$ ps -C xclip
  PID TTY          TIME CMD
14115 pts/10   00:00:00 xclip

そのxclipプロセスは選択 (ここではプライマリ選択) の要求を処理しています。ただし、別のアプリケーションで何かを選択した場合 (またはxselまたは をxclip再度使用して別のものを保存した場合)、そのxclipプロセスは選択をその他のアプリケーションに譲り渡し、終了します。

$ printf test | xsel
$ ps -C xclip
  PID TTY          TIME CMD
$ ps -C xsel
  PID TTY          TIME CMD
14212 ?        00:00:00 xsel

上記、xselからの選択を引き継ぎましたxclip

特定の選択項目の所有者を確認するには、次の操作を行います。

#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
int main(int argc, char* argv[])
{
    Display *d = XOpenDisplay(NULL);
    Window w = XGetSelectionOwner(d, XInternAtom (d, argv[1], False));
    printf("0x%08x\n", w);
    return 0;
}

それから:

$ make xgo LDFLAGS=-lX11
$ ./xgo PRIMARY
0x07000001

これにより、ウィンドウ ID が取得されます。その ID に対してxprop -idまたは を使用できますが、 /xwininfo -idの場合は、あまり多くの情報は取得されません。xclipxsel

GNU/Linux ベースのシステムでは、ltraceX ライブラリ API レベルで何が起こっているかを確認するのに役立ちます。

参照X11プロトコルのトラフィックをキャプチャするX11 プロトコル レベルで何が起こっているかを確認します。

関連情報