
Прочитав этот вопрос обуфер обмена X очищается при выходе из vimЯ узнал, что буфер обмена 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
or 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
Это даст вам идентификатор окна. Вы можете использовать xprop -id
или xwininfo -id
на этом идентификаторе, но в случае xclip
/ xsel
вы не получите много информации.
В системах на базе GNU/Linux ltrace
полезно увидеть, что происходит на уровне API библиотеки X.
Смотрите такжеЗахват трафика протокола X11чтобы увидеть, что происходит на уровне протокола X11.