Copiando comandos com PuTTY e tmux

2

Eu uso o PuTTY do Windows 10 para acessar vários sistemas Linux via SSH. Dentro desses sistemas, freqüentemente uso o Tmux para simplificar minha vida dentro do ambiente Linux. Dentro de uma sessão do Tmux, normalmente tenho uma ou mais janelas que são subdivididas em vários painéis.

Eu uso regularmente o mouse para selecionar / copiar texto no PuTTY e, em seguida, clique com o botão direito para colar. Normalmente isso funciona bem fora do Tmux, quando as linhas são quebradas, mas dentro de uma sessão tmux, não consigo fazer seleção de várias linhas dentro de um painel específico.

Como posso conseguir isso?

    
por Trevor Sullivan 16.10.2016 / 17:15

4 respostas

3

Se você estiver copiando algo para colá-lo dentro do tmux, poderá usar o recurso de copiar / colar incorporado. Se você tiver as configurações ativadas de chave de vi e as configurações padrão, será <prefix> [ para entrar no modo de cópia, navegar para seu texto, space para começar a realçar e enter para ser concluído. Então você pode usar prefix ] para colar dentro do tmux. Note que isto mantém o texto copiado dentro dos próprios buffers do tmux, e ele não entra na área de transferência da máquina local.

Se você precisar colar fora do PuTTY, pode segurar a tecla Alt enquanto seleciona com o mouse para fazer uma seleção de bloco em um painel.

    
por 16.10.2016 / 17:35
1

Com alguns truques, é possível obter o buffer tmux de volta através do PuTTY e para o cliente. Eu realizei isso usando códigos de escape ANSI para a porta "AUX" (impressora serial).

Aqui está apenas uma implementação desse método de transferência:

1) No lado do servidor tmux.conf , adicione:

# Send the tmux copy buffer to a file.  The file is read for ANSI printing by "t" alias in .bashrc
bind -t vi-copy y copy-pipe 'cat > ~/.tmux-buffer' 

2) No lado do servidor .bashrc , adicione:

t() {
  # Configure a PuTTY profile to send "t" as the "Remote command".  This
  # function will automatically reattach to an existing tmux session if one
  # exists, or start a new one.  This function also repeatedly sends our
  # homemade tmux clipboard back to the PuTTY client in the form of an ANSI
  # printer escape sequence.  The contents of the homemade clipboard are
  # populated by 'bind -t vi-copy y copy-pipe 'cat > ~/.tmux-buffer'' in
  # tmux.conf.  It is expected that the PuTTY client will be configured to
  # print to a "Microsoft XPS Document Writer" which saves the printer output
  # to a file.  The file is subsequently read by an AutoHotkey macro, and the
  # contents are made available for paste.
  [[ "$TERM" == "xterm" ]] || return 0 # This prevents recursive runs, in case t() is called after tmux is started.
  { while :; do tput mc5; cat ~/.tmux-buffer; tput mc4; sleep 5; done } &
  tmux attach || tmux
}

3) No lado do cliente (Microsoft Windows), crie uma nova impressora:

  • Adicionar uma impressora
  • Crie uma nova porta > Porta Local
  • Digite um nome de porta > " PuTTY_Printer_File "
  • Driver > Microsoft XPS Document Writer
  • Nome da impressora > " PuTTY Printer "
  • Opcional: Imprima uma página de teste e verifique se ela aparece no conteúdo do arquivo @ " %USERPROFILE%\Documents\PuTTY_Printer_File "

4) Na configuração do PuTTY do lado do cliente:

  • Definir terminal > "Impressora para enviar a saída da impressora ANSI para:" para a impressora recém-criada chamada " PuTTY Printer "
  • Definir conexão > SSH > "Comando remoto:" para " t " (referenciando a função .bashrc acima)

Neste ponto, você pode enviar o conteúdo do buffer tmux para o seu cliente PuTTY, destacando algum texto no modo de cópia do tmux e pressionando y . O texto selecionado terminará em %USERPROFILE%\Documents\PuTTY_Printer_File de volta no cliente. Se você quiser ir além e emular "colando" desse arquivo, você pode usar uma sequência de teclas de atalho para ler o conteúdo do arquivo e inseri-lo. Veja um exemplo que utiliza o AutoHotKey, mas provavelmente é possível obter o mesmo resultado no PowerShell, se você preferir.

5) Macro AutoHotKey do lado do cliente:

;### Get contents of PuTTY ANSI printer device output and paste it
#v:: ;Winkey + v
FileRead, PuTTYPrinter, %USERPROFILE%\Documents\PuTTY_Printer_File
SendInput %PuTTYPrinter%
PuTTYPrinter = ; Free up memory
return

6) Procedimento de uso completo:

  • Conecte-se ao servidor com PuTTY e seja descartado no tmux pela função t ().
  • Quando estiver pronto para selecionar texto para cópia, use a tecla de atalho tmux para o modo de cópia ( Ctrl + b , [ )
  • Mover o cursor com as teclas de seta
  • Iniciar a seleção com spacebar
  • Finalize a seleção e copie-a com y
  • Voltar no lado do cliente executando o PuTTY, WindowsKey + v irá colar a seleção

Como as imagens valem 1.000 palavras, veja uma visão geral do que está acontecendo: link

Links:
Minha resposta no Stack Overflow - link
Demonstração / explicação em vídeo - link

    
por 04.12.2017 / 15:08
0

Uma solução para o problema é primeiro maximizar o painel e, em seguida, copiar o texto usando o mouse. Use o prefixo Z para maximizar o painel atual.

    
por 02.02.2018 / 05:58
0

Para copiar texto de um painel quando houver vários painéis verticais, pressione <Alt> e comece a arrastar o mouse para copiar o bloco de texto. Funciona no Windows 10 conectando-se a um servidor CentOS remoto.

    
por 22.10.2018 / 11:34