“xclip”和“xsel”等命令行剪贴板工具如何保留剪贴板 - 在 X windows 环境中没有?

the*_*fog 6 clipboard x-server

在阅读了有关退出 vim 时清除 X 剪贴板的问题后,我了解到 X 窗口剪贴板仅在程序(从中获得选择)保持打开状态时才存在。
正是由于这种行为,诸如“glipper”和“parcellite”之类的程序才存在。

如果X剪贴板被清除每一个程序退出时,你怎么想的方案xclipxsel工作?
使用这样的程序有什么安全隐患?例如,如果将密码复制到剪贴板,是否可以将此密码保存到某个程序或用户可以访问的临时文件中?

Sté*_*las 9

除非有像xclipboard, clipit... 这样的剪贴板应用程序从他们那里窃取选择,xsel/xclip只要他们拥有选择,就会派生一个后台进程来处理未来的选择请求。

$ printf test | xclip
$ ps -C xclip
  PID TTY          TIME CMD
14115 pts/10   00:00:00 xclip
Run Code Online (Sandbox Code Playgroud)

xclip过程正在处理选择请求(此处为 PRIMARY selection)。但是,如果您在另一个应用程序中选择了某些内容(或使用xselxclip再次存储其他内容),那么该xclip过程会将选择让步给该其他应用程序并终止。

$ printf test | xsel
$ ps -C xclip
  PID TTY          TIME CMD
$ ps -C xsel
  PID TTY          TIME CMD
14212 ?        00:00:00 xsel
Run Code Online (Sandbox Code Playgroud)

以上,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;
}
Run Code Online (Sandbox Code Playgroud)

然后:

$ make xgo LDFLAGS=-lX11
$ ./xgo PRIMARY
0x07000001
Run Code Online (Sandbox Code Playgroud)

这将为您提供窗口 ID。您可以在该 ID 上使用xprop -idxwininfo -id,但在xclip/的情况下xsel,您不会获得太多信息。

在基于 GNU/Linux 的系统上,ltrace查看 X 库 API 级别发生的情况很有用。

另请参阅捕获 X11 协议的流量以了解 X11 协议级别发生的情况。