Copie um arquivo de volta para o sistema local com ssh

257

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?

Shawn J. Goff
fonte
4
Se você possui um servidor ssh em seu cliente, sempre pode tentar scp file.foo [email protected]:file.foo: P
rahmu 28/11
4
Com certeza, mas não quero permitir acesso ao meu computador de um servidor pertencente a uma empresa em que trabalho :) Só tenho autenticação baseada em chave aqui de qualquer maneira e não seria muito seguro colocar minha chave privada no servidor!
Naftuli Kay
2
Eu não entendo o seu problema. Gere um novo par de chaves, copie a parte pública nos seus computadores allowed_keys e após a sua transferência exclua essa linha novamente.
Nils
8
Eu faço muito isso, então seria ineficiente fazer isso toda vez que eu quero copiar um arquivo no meio de uma sessão SSH. Estou apenas procurando uma maneira, durante uma sessão de terminal SSH, de conectar ao meu computador local e enviá-lo para o servidor remoto sem precisar sair da sessão SSH atual.
Naftuli Kay
2
O problema é que o login ssh inicial pode ser um problema (2fa ou outros desafios além da chave ou senha), talvez não tenhamos os privs para alterar a configuração do servidor ssh, não há motivo para negociar as chaves várias vezes e que uma vez que tenhamos uma sessão, seria bom usá-la para várias coisas.
duanev 4/02

Respostas:

139

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. No seu ~/.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:22onde 22042 é um número escolhido aleatoriamente diferente de qualquer outro número de porta na máquina remota. Em seguida, ssh -p 22042 localhostna máquina remota, você será conectado novamente à 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. Digite 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 neste segmento 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 <myfile
 (copie a saída)
local.example.net $ base64 -d> myfile
 (colar 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 enviar e receber dados de xclipou para 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 -
Gilles
fonte
Se podemos transferir arquivos usando SSH, por que as pessoas ainda precisam / usam SFTP?
Pacerier
3
@Pacerier Porque o SFTP é uma maneira de transferir arquivos usando o SSH.
Gilles
Por que as pessoas precisam do SFTP se podem transferir arquivos usando o SSH sem SFTP?
Pacerier
O método de cópia de pasta é particularmente conveniente, com ligações em cadeia (isto é, que salta através de vários hospedeiros para alcançar a final)
Golimar
1
@Pacerier SFTP tem alguns comandos extras, como arquivos de lista ou remover um arquivo etc. remoto
rahmu
67

Outra maneira fácil (IMO) seria:

# to remote host
cat localfile.conf | ssh user@hostname 'cat -> /tmp/remotefile.conf'

# from remote host
ssh user@hostname 'cat /tmp/remotefile.conf' > /tmp/localfile.conf

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

Florian Fida
fonte
8
Honestamente, não entendo por que isso não foi votado. O OP pediu uma solução sem o scp. Às vezes, principalmente no meu caso em que estou transferindo para um roteador fornecido pelo provedor de serviços de Internet muito debilitado, não tenho sftp, não tenho scp e até mesmo o ftp está muito danificado. Eu sabia que podia fazer isso, vim aqui para garantir que minha sintaxe estivesse correta.
Auspex
1
Brilhante! mcé o mais rápido de usar.
Namek
2
Na verdade, esta solução não funciona no meu caso. Com um túnel criado do Windows para o Linux, você inicia na massa, não em um terminal. Esse método é exatamente o que eu queria, mas não posso usá-lo. Irritado.
22717 Benjamin
1
A razão pela qual não estou votando nisso é porque não funcionará se a máquina cliente estiver atrás de um roteador compartilhado (como uma rede corporativa). Suponha que eu esteja em um computador de trabalho e que tenha sido transferido para o servidor doméstico. Como copio um arquivo para o meu computador de trabalho, depois de ter sofrido as dificuldades do cd'ing através de diretórios complexos com espaços e caracteres especiais?
Sridhar Sarnobat
1
Funciona bem com dados binários. Eu faço isso com tgzarquivos o tempo todo :)
Florian Fida 06/06
53

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 !argsparece ser o mais próximo do que você deseja. Observe que você precisará ter PermitLocalCommandativado o seu /etc/ssh_configarquivo para que os ~Ccomandos funcionem (consulte man ssh_config).

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

$ ~C
ssh> !scp file user@myserver:

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.

Corey Henderson
fonte
Isso ainda funciona? Não consegui encontrar !argsna mensagem de ajuda.
xuhdev
@xuhdev ele ainda está lá em OpenSSH_7.2p2, argsnão é na primeira mensagem de ajuda ( ~?), mas no segundo (uma vez que se entra no ssh>tempo com ~C, pode-se digitar helpno ssh>prompt)
sdaau
Parece uma boa solução (embora eu não tenha tentado), não sabia que você pode obter um buffer de linha de comando pai, no estilo vim. Na prática, pode-se simplesmente preferir abrir uma nova guia do terminal para que eles não esqueçam como voltar à sessão (como quando nunca consigo me lembrar de como sair do emacs).
Sridhar Sarnobat
37

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

root@IS1300:~# sshfs 192.168.1.2:/ /mnt/sshfs
root@IS1300:~# umount /mnt/sshfs

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

Dilema
fonte
4
Conectando com um arquivo-chave:sshfs -oIdentityFile=~/.ssh/keyfile.pem [email protected]:/ /mnt/sshfs/
sshow 20/09/2015
15
  • Use o 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.
  • Portas reversa ( -R, para remoto para local) ou encaminhada ( -L, para local para remoto) para executar transferências de arquivos, supondo que você tenha algum daemon de transferência de arquivos ouvindo na outra extremidade.

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 ControlMastere ControlPath configurado (também ControlPersisté útil),

  # primeira conexão
$ ssh remote

  # multiplexará na mesma conexão que o ssh original abriu
$ sftp remote
efémero
fonte
5
zmodem me lembra a baixar a última shareware do BBS locais .. :-)
Stuart Woodward
A maneira xfer é exatamente o que eu estava procurando, mas você sabe por que o patch ssh-xfer não está incluído no OpenSSH upstream? Alguma chama?
Ferran Basora
Obrigado pela dica zssh! Estou usando o tmux no Konsole e por causa do tmux meu "sz" do servidor não está mais funcionando. O zssh resolve meus problemas!
0xAF
9

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.

Larry Jones
fonte
Sim ou sftp, conforme sugerido aqui .
Atomicules
Acredito que o servidor FileZilla é apenas para Windows. Porém, o cliente é multiplataforma
Freedom_Ben 24/07
Você pode até usar o Caja, basta abrir ssh://SERVER.
basic6
8

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

No servidor, você usa xclip-copyfilepara 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 scpou ter um servidor ssh local. Eu uso isso com o cygwin, por exemplo. O único problema é que isso requer instalação, xclipse você ainda não o possui. Ah, e isso funciona com arquivos binários também.

Robert
fonte
Uau, isso pode ser uma solução melhor do que meu encaminhamento de porta reversa mais o netcat.
Sridhar Sarnobat
3

Uma das muitas razões pelas quais usamos o SecureCRT - apesar de preferir o software de código aberto, quando 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 Windows puro em meados dos anos 90, 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 antigo de emulador de terminal, 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-downloadna linha de comando remota, o szprograma remoto grava uma sequência de escape que informa ao SecureCRT para iniciar imediatamente file-to-downloado download no diretório de download padrão.

    Um toque interessante é 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 lrzszpacote. Ele já está empacotado para a maioria dos sistemas Unixy. Se por algum motivo seu sistema remoto ainda não o tiver instalado e você não puder instalar facilmente um pacote binário, o O pacote fonte é pequeno e altamente portátil. Mais de uma vez, tive que enviar um lrzsz pacote "sharchive" ou uuencode'tar' para um sistema remoto simplificado para que eu pudesse arquivar arquivos do ZModem.)

  • SFTP - O SecureCRT possui uma implementação básica de SFTP totalmente 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 arquivos separado, o 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 sftpprograma do OpenSSH , exceto que possui recursos como a Tabconclusão de comandos. Assim, recuperar um arquivo remoto chamado somefile.tar.gzpode ser tão fácil quanto get soTabEnter.

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

    Como alternativa, você pode abrir uma guia SFTP e soltar um arquivo nessa guia para enviá-lo via SFTP. Assim, o envio de um arquivo para um sistema remoto pode ser tão simples como Alt-P, arrastar , soltar .

    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 das modernas 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 boa sobre o modo de operação de arrastar e soltar é que ele elimina uma das tensões do uso do ZModem. Quando você digita rzno sistema remoto, o SecureCRT exibe um seletor de arquivos automaticamente. Você tem cerca de um minuto para encontrar e selecionar o arquivo antes do tempo limite do lado remoto. 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 rzcomando explícito . 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.

Warren Young
fonte
1

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

Nils
fonte