Copiar entrada para a área de transferência por SSH?

33

Aqui está o meu caso de uso:

  • Costumo conectar-me a outros computadores através do SSH para trabalhar, e muitas vezes preciso copiar e colar documentos / texto do servidor para editores em execução local para escrever exemplos e compartilhar texto.
  • Freqüentemente, se o texto for pequeno o suficiente, copiarei a saída do meu programa de terminal (gnome-terminal no momento) e colo-o.
  • No entanto, quando se trata de documentos inteiros, minhas opções são bastante limitadas. Posso copiar o documento pedaço por pedaço ou scpna máquina local.

Existe uma maneira de usar um programa como o xclipque me permitirá copiar remotamente stdinpara a área de transferência do servidor X local? Algo para o efeito de:

cat myconffile.conf | sed {...} | copy-over-ssh-to-local-clipboard

seria fantástico. Existe algo para tornar isso possível?

Naftuli Kay
fonte

Respostas:

20

Se você executar o ssh com o encaminhamento do X, isso será transparente: os comandos remotos (inclusive xclip) terão acesso ao seu servidor X (incluindo o teclado). Verifique se você possui ForwardX11 yesno servidor ~/.ssh/confige X11Forwarding yesno servidor sshd_config(dependendo de suas distribuições, essas opções podem estar ativadas ou desativadas por padrão).

<myconffile.conf sed {...} | xclip -i

Existem outras maneiras de trabalhar com arquivos remotos que podem ser mais convenientes, por exemplo, montar diretórios remotos em sua máquina local com SSHfs ou abrir arquivos remotos no Emacs com Tramp . Se você tem o ssh e o FUSE configurados e os SSHfs instalados, os SSHfs são tão fáceis quanto mkdir ~/net/myserver; sshfs myserver:/ ~/net/myserver. Se você tem o ssh configurado e o Emacs instalado, o Tramp é tão fácil quanto abrir /myserver:/path/to/file.

Gilles 'SO- parar de ser mau'
fonte
1
Alguma vulnerabilidade de segurança para executar as coisas dessa maneira por padrão no arquivo conf?
Naftuli Kay
Não. Todo o tráfego x11 é encaminhado através do canal SSH.
Shadur 15/07/11
2
@TKKocheran Na verdade não. No lado do servidor, nenhum. No lado do cliente, um pouco, na medida em que fornece ao administrador do servidor uma maneira de entrar no seu cliente, mas em 99% dos casos o administrador do servidor tem uma maneira; consulte Se alguém está conectado ao SSH no meu computador, posso acessar o computador?
Gilles 'SO- stop be evil'
7

Você não precisa de nada de especial; desde que xclipfunciona stdin, apenas

ssh remotehost xclip < myconf.conf

Por que precisaria ser modificado sed? sshé transparente aos dados quando não usado como terminal e é comumente usado em tubulações como

tar cfz - somedir | ssh remotehost 'cd destdir; tar xfz -'`
geekosaur
fonte
Existe uma maneira de fazer isso a partir de uma sessão SSH existente? Eu realmente preferiria não ter que abrir outra janela do terminal se já tiver uma aberta na máquina em questão.
Naftuli Kay
E o sed` é apenas um exemplo, se eu gostaria de executar qualquer processamento stdinantes de copiá-lo para a área de transferência, gostaria dessa opção.
Naftuli Kay
Não, não há como injetar dados em uma sshsessão existente (não seria muito seguro se você pudesse). Você pode configurar o ssh ControlMastermaterial para multiplexar conexões adicionais por uma já existente, mas isso não é realmente algo para iniciantes e você continuará fazendo o mesmo depois, alternando para outro terminal local e executando o comando acima (que não abre um novo janela do terminal).
Geekosaur
@NaftuliKay Para uma solução que funcione dentro da sua sessão SSH normal, veja minha resposta .
tanius 02/02
5

Veja como você faria isso no OSX a partir da sua máquina local

ssh remotehost.com "<some/file.txt" | pbcopy
William Casarin
fonte
3

se a sua máquina local estiver executando o Windows (7+), você pode usá-lo apenas no CommandLine:

ssh user@server cat /home/user/file | clip
d.raev
fonte
1

~ / .ssh / config:

Host REMOTEHOST
    ...
    ForwardX11 yes

/ etc / ssh / sshd_config:

X11Forwarding yes

bater:

$ xclip -o | ssh REMOTEHOST 'DISPLAY=:0 xclip -i'
superqwerty
fonte
1

Muito parecido com as soluções @ d-raev e @ william-casarin, no entanto, é diferente, então estou compartilhando o que funcionou para mim.

O comando

ssh user@host "cat <myconffile.conf" | xclip -sel clip

Explicação

Isso é usar sshpara criar um túnel seguro, acesse user@ hostou ip, então executar catpara imprimir o conteúdo de <myconffile.confque stdout, em seguida, tubulação que para o comando xclip -sel clipem sua máquina local, o que coloca o conteúdo <myconffile.confna área de transferência em sua máquina local.

Exemplo de uso no mundo real

Eu uso essa estrutura de comando para tarefas como colar chaves ssh no github (permitindo uma simples seleção de ctrl-V ou colar depois de executar o comando) no Bash no Ubuntu 16.04 e 18.04. Confira man ssh, man cate man xclippara o comportamento e opção detalhes.

Jason R Stevens CFA
fonte
Isso até funciona para copiar de servidores sem cabeça, onde xclipnão será executado porque não há X.
tanius
0

Eu tenho um problema semelhante com a área de transferência do LUbuntu lxterminal(testados vários terminais) em uma sshsessão. Se a área de transferência tiver mais de 100 bytes, a sessão expirará e falhará.

Se eu conectar via ssh a quase qualquer servidor CentOS 5.xe depois conectar ao servidor de destino, a pasta da área de transferência funcionará sem problemas para qualquer tamanho de dados razoável.

Vasyl
fonte
0

Copiando de um servidor sem cabeçalho para a área de transferência local, de dentro da sua sessão SSH habitual:

  1. Instale ncatna sua máquina local e remota. (Na sua máquina remota, você também pode usar com ncou simples telnet, mas na máquina local, precisamos das opções para executar comandos ( -c/ -e) que não estão disponíveis nas ncdistribuições usuais, como Debian e Ubuntu.)

    apt install nmap
    
  2. Na sua máquina local, configure um servidor atendendo na interface local que copiará o conteúdo que entra na porta 10009 para a área de transferência do X:

    ncat --keep-open --listen --sh-exec "xclip -selection clipboard" localhost 10009
    

    Ou use a versão abreviada equivalente:

    ncat -klc "xclip -sel c" localhost 10009
    
  3. SSH na máquina remota de forma que um túnel reverso seja estabelecido da porta 10008 da máquina remota para a porta 10009 na sua máquina local (onde o servidor está escutando). Você pode usar essa sessão SSH para o seu trabalho normal.

    ssh -R 10008:localhost:10009 [email protected]
    
  4. Quando você deseja copiar o conteúdo de um arquivo da máquina remota para a área de transferência local, execute no shell SSH:

    ncat --send-only localhost 10008 < file.txt
    

    E, claro, isso é melhor quando compactado como um atalho ou script de shell. Poderíamos chamá-lo rclipde "[copiar para] área de transferência remota" em analogia ao conhecido xclip.

Vantagens

  • Não é necessário abrir outra sessão SSH para a máquina remota.

  • Não é necessário xclipna máquina remota; portanto, funciona se você não pode instalá-lo ou não pode usá-lo porque é um servidor sem cabeça sem o X.

Segurança

Fazemos ncat -l localhost 10009pelo servidor, o que significa que ele escuta apenas na interface de rede com o localhostendereço IP. Essa interface de loop local permite apenas conexões de sua própria máquina (incluindo, nesse caso, aquelas com túnel reverso via SSH). Portanto, mesmo se você não estiver protegido por um firewall, sua porta 10009 não estará exposta a ninguém na Internet.

Fonte

Adaptado da lista dergachev / ssh-forward-clipboard.md para trabalhar com o Linux. Essa essência também contém instruções sobre como tornar o túnel reverso SSH um padrão.

tanius
fonte
-1

https://secure.wikimedia.org/wikipedia/en/wiki/Base64

Você pode converter os dados da área de transferência com o texto Base64 em ASCII. Em seguida, você pode fazer isso através de uma conexão SSH já existente.

LanceBaynes
fonte
Por que converter para alguma coisa? Já é texto neste caso e, mesmo que fosse binário, não haveria motivo para você não poder enviá-lo por um pipeline como esse.
Caleb
prancheta poderia conter dados binários, por exemplo: a aplicação compilada
LanceBaynes
Sim, poderia, mas por que isso seria um problema? Os dados binários podem ser transferidos através de um túnel pipe e ssh.
Caleb