读完这个问题后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
or ,但在/xwininfo -id
的情况下,您不会获得太多信息。xclip
xsel
在基于 GNU/Linux 的系统上,ltrace
了解 X 库 API 级别发生的情况非常有用。
也可以看看捕获X11协议的流量查看 X11 协议级别发生的情况。