像「xclip」和「xsel」這樣的命令列剪貼簿工具如何保留剪貼簿——在 X windows 環境中卻沒有?

像「xclip」和「xsel」這樣的命令列剪貼簿工具如何保留剪貼簿——在 X windows 環境中卻沒有?

讀完這個問題後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流程正在處理選擇請求(此處為主要選擇)。但是,如果您在另一個應用程式中選擇某些內容(或再次使用xselxclip來儲存其他內容),則該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 -idor ,但在/xwininfo -id的情況下,您不會獲得太多資訊。xclipxsel

在基於 GNU/Linux 的系統上,ltrace了解 X 庫 API 層級發生的情況非常有用。

也可以看看捕獲X11協定的流量查看 X11 協定層級發生的情況。

相關內容