the*_*fog 6 clipboard x-server
在阅读了有关退出 vim 时清除 X 剪贴板的问题后,我了解到 X 窗口剪贴板仅在程序(从中获得选择)保持打开状态时才存在。
正是由于这种行为,诸如“glipper”和“parcellite”之类的程序才存在。
如果X剪贴板被清除每一个程序退出时,你怎么想的方案xclip
和xsel
工作?
使用这样的程序有什么安全隐患?例如,如果将密码复制到剪贴板,是否可以将此密码保存到某个程序或用户可以访问的临时文件中?
除非有像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)。但是,如果您在另一个应用程序中选择了某些内容(或使用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
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 -id
或xwininfo -id
,但在xclip
/的情况下xsel
,您不会获得太多信息。
在基于 GNU/Linux 的系统上,ltrace
查看 X 库 API 级别发生的情况很有用。
另请参阅捕获 X11 协议的流量以了解 X11 协议级别发生的情况。