Como as ferramentas da área de transferência da linha de comando, como "xclip" e "xsel", persistem na área de transferência - em um ambiente X Windows que não o faz?

Como as ferramentas da área de transferência da linha de comando, como "xclip" e "xsel", persistem na área de transferência - em um ambiente X Windows que não o faz?

Depois de ler esta pergunta sobrea área de transferência do X sendo limpa quando o vim é encerradoAprendi que a área de transferência da janela X só existe enquanto o programa - do qual a seleção foi obtida - permanece aberto.
É por causa desse comportamento que existem programas como "glipper" e "parcellite".

Se a área de transferência do X for limpa toda vez que um programa for encerrado, como os programas gostam xclipe xselfuncionam?
E quais são as implicações de segurança do uso de programas como este? Por exemplo, se uma senha fosse copiada para a área de transferência, essa senha poderia ser salva em algum arquivo temporário que pudesse ser acessado por programas ou usuários?

Responder1

A menos que haja um aplicativo de área de transferência como xclipboard... clipitque roube as seleções deles, xsel/ xclipcriará um processo em segundo plano para lidar com as solicitações de seleção futuras, desde que eles possuam a seleção.

$ printf test | xclip
$ ps -C xclip
  PID TTY          TIME CMD
14115 pts/10   00:00:00 xclip

Esse xclipprocesso trata de solicitações de seleção (aqui seleção PRIMÁRIA). Mas, se você selecionar algo em outro aplicativo (ou usar xselou xclipnovamente para armazenar outra coisa), esse xclipprocesso concederá a seleção a esse outro aplicativo e será encerrado.

$ printf test | xsel
$ ps -C xclip
  PID TTY          TIME CMD
$ ps -C xsel
  PID TTY          TIME CMD
14212 ?        00:00:00 xsel

Acima, xselassumiu a seleção de xclip.

Você pode descobrir quem possui uma determinada seleção com:

#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;
}

Então:

$ make xgo LDFLAGS=-lX11
$ ./xgo PRIMARY
0x07000001

Isso lhe dará o ID da janela. Você pode usar xprop -idor xwininfo -idnesse ID, mas no caso de xclip/ xsel, você não obterá muitas informações.

Em sistemas baseados em GNU/Linux, ltraceé útil ver o que está acontecendo no nível da API da biblioteca X.

Veja tambémCapture o tráfego do protocolo X11para ver o que está acontecendo no nível do protocolo X11.

informação relacionada