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 do X Windows que não?

4

Depois de ler esta pergunta sobre a área de transferência do X sendo limpa quando o vim é encerrado Aprendi 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".

O que eu estou interessado em saber é que, se a área de transferência do X for limpa toda vez que um programa for encerrado, como programas como xclip e xsel funcionam?
E quais são as implicações de segurança de usar programas como esse? por exemplo. se uma senha foi copiada para a área de transferência, essa senha pode ser salva em algum arquivo temporário que possa ser acessado por programas ou usuários?

    
por the_velour_fog 02.06.2017 / 12:55

1 resposta

7

A menos que haja um aplicativo da área de transferência como xclipboard , clipit ... que rouba as seleções deles, xsel / xclip criará um processo em segundo plano para manipular as futuras solicitações de seleção, desde que elas sejam proprietárias seleção.

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

Esse processo xclip está manipulando solicitações para a seleção (aqui seleção PRIMARY). Mas, se você selecionar algo em outro aplicativo (ou usar xsel ou xclip novamente para armazenar outra coisa), esse processo xclip concederá a seleção a esse outro aplicativo e terminará.

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

Acima, xsel assumiu 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 fornecerá a ID da janela. Você pode usar xprop -id ou xwininfo -id nesse ID, mas, no caso de xclip / xsel , não obterá muita informação.

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

Veja também Capture o tráfego do protocolo X11 para ver o que está acontecendo no nível do protocolo X11.

    
por 02.06.2017 / 15:13