web-development-kb-pt.site

Copie um arquivo de volta para o sistema local com ssh

Se eu estiver conectado a um sistema via SSH, existe uma maneira de copiar um arquivo de volta para o meu sistema local sem iniciar outra sessão de terminal ou tela e fazer scp ou algo semelhante ou sem fazer SSH do sistema remoto de volta ao sistema local?

271
Shawn J. Goff

Conexão mestre

É mais fácil se você planejar com antecedência.

Abra uma conexão principal pela primeira vez. Para conexões subseqüentes, roteie as conexões escravas através da conexão principal existente. Na tua ~/.ssh/config , configure o compartilhamento de conexão para que ocorra automaticamente:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

Se você iniciar uma sessão ssh da mesma maneira (usuário, porta, máquina) que uma conexão existente, a segunda sessão será encapsulada na primeira. O estabelecimento da segunda conexão não requer nova autenticação e é muito rápido.

Portanto, enquanto você tem sua conexão ativa, pode rapidamente:

Encaminhamento

Em uma conexão existente, você pode estabelecer um túnel ssh reverso. Na linha de comando ssh, crie um encaminhamento remoto passando -R 22042:localhost:22 onde 22042 é um número escolhido aleatoriamente que é diferente de qualquer outro número de porta na máquina remota. Então ssh -p 22042 localhost na máquina remota conecta você de volta à máquina de origem; você pode usar scp -P 22042 foo localhost: para copiar arquivos.

Você pode automatizar isso ainda mais com RemoteForward 22042 localhost:22. O problema é que, se você se conectar ao mesmo computador com várias instâncias do ssh, ou se alguém estiver usando a porta, não receberá o encaminhamento.

Se você não tiver ativado o encaminhamento remoto desde o início, poderá fazê-lo em uma sessão ssh existente. Tipo Enter ~C Enter -R 22042:localhost:22 Enter. Consulte "Caracteres de escape" no manual para obter mais informações.

Há também algumas informações interessantes em este thread de falha do servidor .

Copiar colar

Se o arquivo for pequeno, você pode digitá-lo e copiar e colar da saída do terminal. Se o arquivo contiver caracteres não imprimíveis, use uma codificação como base64 .

 remote.example.net $ base64 <meuarquivo 
  (copia a saída) 
 local.example.net $ base64 -d> myfile 
  (cole o conteúdo da área de transferência) Ctrl+D

Mais convenientemente, se você tiver o encaminhamento X ativo, copie o arquivo na máquina remota e cole-o localmente. Você pode canalizar e entrar dados de xclip ou xsel . Se você deseja preservar o nome do arquivo e os metadados, copie e cole um arquivo morto.

remote.example.net$ tar -czf - myfile | xsel
local.example.net$ xsel | tar -xzf -
144

Outra maneira fácil (IMO) seria:

# to remote Host
cat localfile.conf | ssh [email protected] 'cat -> /tmp/remotefile.conf'

# from remote Host
ssh [email protected] 'cat /tmp/remotefile.conf' > /tmp/localfile.conf

Ou, se você preferir algo semelhante a uma GUI, tente Midnight Commander . Eles chamam o recurso Shell-Link. A maioria das distros os possui em seus sistemas de pacotes como mc.

75
Florian Fida

O SSH suporta alguns comandos, por meio do caractere de escape (~ por padrão):

$ ~?
Supported escape sequences:
  ~.  - terminate connection (and any multiplexed sessions)
  ~B  - send a BREAK to the remote system
  ~C  - open a command line
  ~R  - Request rekey (SSH protocol 2 only)
  ~^Z - suspend ssh
  ~#  - list forwarded connections
  ~&  - background ssh (when waiting for connections to terminate)
  ~?  - this message
  ~~  - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

$ ~C
ssh> help
Commands:
      -L[bind_address:]port:Host:hostport    Request local forward
      -R[bind_address:]port:Host:hostport    Request remote forward
      -D[bind_address:]port                  Request dynamic forward
      -KR[bind_address:]port                 Cancel remote forward
      !args                                  Execute local command

O !args parece estar mais próximo do que você deseja. Observe que você precisará ter PermitLocalCommand ativado em seu /etc/ssh_config _ em ordem para o ~C comandos para funcionar (consulte man ssh_config).

Você pode reutilizar a mesma sessão ssh se configurar um ControlMaster em ssh_config. Se você fizer isto:

$ ~C
ssh> !scp file [email protected]:

você tecnicamente nunca saiu da sessão ssh e não precisa se autenticar novamente. Provavelmente mais complicado do que você gostaria, mas não consigo pensar em outra maneira fácil.

54
Corey Henderson

Todos esses são métodos muito complicados.
Você pode montar o sistema de arquivos remoto em sua máquina local com sshfs:

mkdir -p /mnt/sshfs

[email protected]:~# sshfs 192.168.1.2:/ /mnt/sshfs
[email protected]:~# umount /mnt/sshfs

Em seguida, você pode copiar e colar o arquivo com nautilus, gnome, konqueror, dolphin, bash ou qualquer outra coisa.

38
Quandary
  • Use ssh-xfer , um agente ssh modificado que sobrecarrega efetivamente um canal lateral ssh existente para uso na transferência de arquivos.
  • Use zssh , que é efetivamente zmodem sobre ssh. Se você já usou o rzsz, isso parecerá muito familiar.
  • Reverter (-R, para remoto para local) ou encaminhar (-L, para portas local-remota) executarem transferências de arquivos, supondo que você tenha algum daemon de transferência de arquivos ouvindo do outro lado.

Mas nada disso é realmente necessário, IMO. O protocolo SSH suporta múltiplos canais em uma única conexão, e o cliente OpenSSH suporta multiplexação. Supondo que você tenha ControlMaster e ControlPathconfigurado (ControlPersist também é útil),

# primeira conexão
 $ ssh remote 
 
 # multiplexará na mesma conexão que o ssh original abriu
 $ sftp remote 
15
ephemient

Uma abordagem ainda mais simples: abra o Filezilla (ou seu navegador FTP favorito), abra uma conexão ssh no mesmo site, encontre o arquivo e arraste-o para a estrutura de arquivos local. Se você é novo no Filezilla, use o recurso "gerenciador de sites" para se reconectar rapidamente da próxima vez.

Sim, eu sei que isso é óbvio para a maioria de vocês (e não exatamente), mas alguns (como eu) que encontraram esse thread em busca de uma solução apenas para terminal podem ter esquecido o óbvio.

9
Larry Jones

O que eu achei ser a melhor e mais eficiente solução é usar xclip-copyfile e xclip-pastefile.

No servidor, você usa xclip-copyfile para copiar um ou mais arquivos. Esses arquivos estão disponíveis no servidor local. Lá, você pode usar xclip-pastefile.

Isso ignora a necessidade de usar scp ou ter um servidor ssh local. Eu uso isso com o cygwin, por exemplo. O único problema é que isso requer a instalação de xclip se você ainda não o possui. Ah, e isso funciona com arquivos binários também.

8
Robert

Uma das muitas razões pelas quais usamos SecureCRT - apesar de preferirmos o software de código aberto onde for prático - é a facilidade de fazer transferências de arquivos. Simplesmente não há substituição direta no mundo do F/OSS.

O SecureCRT começou como um programa puro do Windows em meados da década de 1990, mas foi portado para o Mac OS X e Linux há alguns anos .

O SecureCRT possui três recursos principais para a transferência de arquivos de e para um sistema no qual o SSH está inserido:

  • ZModem , YModem , XModem , Kermit e ASCII - SecureCRT é um tipo de emulador de terminal antigo, suportando vários protocolos de transferência de arquivos em banda.

    O mais fácil de usar é o ZModem. Quando você digita algo como sz file-to-download na linha de comando remota, o programa remoto sz grava um sequência de escape que informa ao SecureCRT para iniciar o download imediatamente file-to-download para o diretório de download padrão.

    Um toque agradável é que o diretório de download é personalizável por sessão. Usamos isso para ter diretórios por site em nosso servidor de arquivos do escritório principal, para que não tenhamos que ordenar manualmente os arquivos baixados.

    (sz é o programa "send ZModem", parte do pacote lrzsz . Ele já está empacotado para a maioria dos sistemas Unixy. Se por algum motivo seu sistema remoto não já o tem instalado e você não pode instalar facilmente um pacote binário, o pacote de origem é pequeno e altamente portátil. Mais de uma vez, tive que enviar um lrzsz"sharchive " ou uuencode 'tarball para um sistema remoto despojado, para que eu pudesse arquivar arquivos do ZModem.)

  • [~ # ~] sftp [~ # ~] - O SecureCRT tem uma implementação SFTP básica firmemente integrada.

    Por "totalmente integrado", quero dizer que, quando você fornece o comando de menu SFTP ou o atalho de teclado, ele abre uma nova guia conectada ao site remoto pela mesma conexão SSH. Portanto, você não precisa fazer login novamente, e a conexão é estabelecida um pouco mais rápido do que se você tivesse aberto uma conexão SFTP separada para o mesmo servidor.

    Eu caracterizo o recurso SFTP como "básico", porque o VanDyke Software possui um produto de transferência de arquivo separado, SecureFX . É mais funcional que o cliente SFTP embutido e também se integra ao SecureCRT.

    O recurso SFTP do SecureCRT permite configurar diretórios remotos e locais padrão que são separados da configuração do ZModem.

    Esse recurso SFTP possui um tipo básico de interface de linha de comando, imitando o programa sftp do OpenSSH, exceto que possui recursos como Tab conclusão do comando. Assim, recuperando um arquivo remoto chamado somefile.tar.gz pode ser tão fácil quanto get soTabEnter.

  • Arrastar e soltar - Se você arrastar e soltar um arquivo na janela do terminal, ele automaticamente digitará rz para você e começa a enviar o arquivo.

    Como alternativa, você pode abrir uma guia SFTP e soltar um arquivo nessa guia para enviá-lo via SFTP. Portanto, enviar um arquivo para um sistema remoto pode ser tão simples quanto Alt-P, arraste, solte.

    Nós descobrimos que as transferências acontecem muito mais rapidamente via SFTP, provavelmente porque é um protocolo baseado em TCP, por isso se beneficia das grandes janelas deslizantes dos modernos pilhas TCP/IP . O ZModem foi desenvolvido nos dias em que um tamanho de bloco de 64 kiB era considerado "grande". Assim, grande parte da velocidade potencial de um link é absorvida no ZModem enquanto cada extremidade aguarda as confirmações de transferência de bloco.

    Uma coisa interessante sobre o modo de operação de arrastar e soltar é que ele elimina uma das tensões do uso do ZModem. Quando você digita rz no sistema remoto, o SecureCRT exibe um seletor de arquivos automaticamente. Você tem cerca de um minuto para encontrar e selecionar o arquivo antes que o tempo do controle remoto se esgote. Isso cria uma vibração de corrida contra o relógio que não é agradável. Arrastar e soltar permite que você encontre o arquivo à vontade e inicie a transferência com um único movimento rápido do mouse.

    Ainda usamos o método manual, iniciando a transferência com um comando explícito rz. Isso ocorre porque o SecureCRT permite configurar um diretório de upload por sessão, que apontamos para a pasta no servidor de arquivos que sempre contém a versão mais recente do software que esse site remoto específico está executando. Para essas transferências, não há corrida contra o relógio, pois o seletor de arquivos é aberto no local correto para começar.

3
Warren Young

Usar "!" para converter o arquivo em uma representação ASCII do seu arquivo (por exemplo, ! uuencode myfile.bin >uuencode.dat). Então use ! cat uuencode.dat >target.dat. Depois disso, use o uudecode no lado do destino: ! uudecode target.dat >myfile.bin

1
Nils