像“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 协议级别发生的情况。

相关内容