Каким образом инструменты командной строки для работы с буфером обмена, такие как «xclip» и «xsel», сохраняют буфер обмена в среде X Windows, где этого не происходит?

Каким образом инструменты командной строки для работы с буфером обмена, такие как «xclip» и «xsel», сохраняют буфер обмена в среде X Windows, где этого не происходит?

Прочитав этот вопрос обуфер обмена 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процесс обрабатывает запросы на выбор (здесь ПЕРВИЧНЫЙ выбор). Но если вы выберете что-то в другом приложении (или снова используете xselor 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.

Связанный контент