Faça o download de um arquivo em uma sessão SSH ativa

86

Quero baixar um arquivo de uma sessão SSH ativa. Em muitos casos, eu provavelmente poderia simplesmente usar SFTP, scp, rsyncet al, mas há momentos em que tenho elevados permissões no servidor remoto de uma maneira que não pode usar esses métodos.

Se você está lutando para entender o que quero dizer, imagine que você queria baixar algo de /root/ou /var/log/auth.log. O login raiz está desativado (porque não somos idiotas). Como você consegue esse arquivo? Copiá-lo para um lugar menos protegido e depois movê-lo? Isso é desajeitado. Também existem cenários em que o caminho remoto é complexo ou temporário, ou nem é um caminho, porque desejo que a saída de um comando remoto seja armazenada localmente. Armazene remotamente e copie? Clunk!

Existem várias maneiras mais complicadas de obter versões dessas, mas em um mundo ideal, eu teria algo parecido com o acesso local de gravação do servidor remoto, usando a sessão SSH existente como um canal. Algo como (isso é apenas a impressão de um artista):

$oli@remote: cp /root/cheesecake /local/

E isso apenas aparece no meu local cwd. E o acesso bidirecional não seria uma coisa ruim.


Faz oito longos anos desde que fiz essa pergunta e vimos uma verdadeira variedade de clunk, mas continua sendo um problema com o qual ainda luto ocasionalmente.

Refatorei a pergunta para algo muito mais idealista. Compreendo perfeitamente que atualmente não haja uma resposta perfeita. Todos os esforços passados ​​e futuros em direção ao meu ideal são apreciados.

Oli
fonte
1
Pergunta interessante! Isso realmente mostra como as idéias das pessoas sobre o que é sensato fazer são moldadas pelas ferramentas que elas usam. zsshprovavelmente é o mais próximo do fluxo de trabalho do tipo zmodem que você pode estar se lembrando.
poolie
1
Eu estou realmente surpreso que mesmo depois de 8 respostas, não há realmente nenhuma maneira de fazer isso
endolith

Respostas:

34

Convém verificar o zssh , que está disponível no universo e, portanto, disponível com

sudo apt-get install zssh

Você precisa dele no seu servidor ubuntu e no seu cliente, mas basicamente quando está logado com o zssh, basta clicar em 'ctrl- @' e ele exibe o "Modo de transferência de arquivo", que permite enviar arquivos de volta pelo canal para o seu máquina cliente ou carregue-os do cliente para o servidor.

No entanto, você não precisa autenticar novamente ou abrir uma nova janela para o scp.

Se você estiver usando chaves ssh e um agente ssh, poderá fazer com facilidade:

[enter]~[ctrl]-Z

Qual será o segundo plano ssh, e então scp $!:/whatever/whatever .'

Depois que o arquivo for transferido, fgvolte ao ssh.

Se você não estiver usando as teclas ssh, ainda poderá usar as opções "ControlMaster" e "ControlPath" adicionadas às versões recentes do OpenSSh, mas isso fica complicado, verifique man ssh_config

SpamapS
fonte
24

Supondo que você esteja executando um servidor ssh na área de trabalho (existem maneiras de contornar isso, mas acho que todos eles acrescentam complexidade e possivelmente têm problemas de segurança), você pode configurar um túnel ssh reverso. Veja SSH copiar facilmente o arquivo para o sistema local. sobre a unix.SE .

  • Digite Enter ~C Enter -R 22042:localhost:22 Enterpara criar um encaminhamento de porta reversa do servidor para a área de trabalho (22042 pode ser qualquer número de porta entre 1024 e 65534 que não esteja em uso).
  • Em seguida scp -P 22042 foo localhost:, copiará o arquivo fooem seu diretório atual no servidor para sua casa na área de trabalho.
  • Agora mova o arquivo para o diretório atual na área de trabalho, digitando Enter ~ Ctrl+ Z mv ~/foo . Enter fg Enter.

As sequências de escape ssh começam com ~; o til só é reconhecido após uma nova linha. ~ Ctrl+Zcoloca ssh em segundo plano. ~Centra em uma linha de comando onde você pode criar ou remover um encaminhamento.

Gilles
fonte
1
O uso de duas camadas de criptografia e compactação é um pouco exagerado, por isso sugeri o uso de rsh ou ftp para o "back link".
JanC 16/11/10
2
@ JanC: Isso requer mais configuração: você precisa instalar um servidor rsh ou ftp e garantir que sua configuração seja segura. A sobrecarga de criptografia é mínima, mesmo em um netbook.
Gilles
Um servidor ssh também não é instalado por padrão. ;)
janc
@ JanC: Outra vantagem do ssh é que, se você tiver ativado o encaminhamento de agentes, não precisará digitar uma senha para fazer a cópia. Eficiência do fluxo de trabalho sobre a microeficiência de computação.
Gilles
Você pode fazer algo assim com (alguns) outros serviços também, é claro. Em qualquer caso, existem várias soluções semelhantes que todos envolvem a criação de uma conexão encapsulada para trás e um daemon adicional ...;)
janc
10

Eu vim com uma maneira de fazer isso com o ssh padrão. É um script que duplica a conexão ssh atual, localiza seu diretório de trabalho na máquina remota e copia de volta o arquivo especificado para a máquina local. Ele precisa de 2 scripts muito pequenos (1 remoto, 1 local) e 2 linhas na sua configuração ssh. Os passos são os seguintes:

  1. Adicione estas 2 linhas ao seu ~/.ssh/config:

    ControlMaster auto
    ControlPath ~/.ssh/socket-%r@%h:%p
    

    Agora, se você tiver uma conexão ssh com o machineX aberta, não precisará de senhas para abrir outra.

  2. Crie um script de 1 linha na máquina remota chamada ~/.grabCat.sh

    \#!/bin/bash<br>
    cat "$(pwdx $(pgrep -u $(whoami) bash) | grep -o '/.*' | tail -n 1)"/$1
    
  3. Crie um script na máquina local chamado ~ / .grab.sh

    \#!/bin/bash
    [ -n "$3" ] && dir="$3" || dir="."
    ssh "$1" ".grabCat.sh $2" > "$dir/$2"
    
  4. e crie um alias para grab.sh em ( ~/.bashrcou em qualquer outro lugar):

    alias grab=~/.grab.sh
    

É isso, tudo feito. Agora, se você estiver conectado machineX:/some/directory, inicie um novo terminal e digite

grab machineX filename

Isso coloca o arquivo no seu diretório de trabalho atual na máquina local. Você pode especificar um local diferente como terceiro argumento para "agarrar".

Nota: Obviamente, ambos os scripts devem ser "executáveis", ie chmod u+x filename.

sebix
fonte
Interessante, você poderia explicar como isso funciona? Você é capaz de estender isso para oferecer suporte à "colocação" de arquivos e também para agarrá-los?
Peter Gibson
5

Se a sua máquina cliente (a máquina em que você está sentado) for chamada machineA e a máquina na qual você está atualmente com SSH for chamada machine B. MachineA, sua máquina local deverá ter o SSHD em execução e a porta 22 aberta. Então:

scp myfile machineA:

Cópias myfileno MachineB no diretório inicial do MachineA no machineA. Isso pressupõe identificação do usuário / senha iguais.

scp myfile machineA:/newdir/newname

Copia myfileum MachineB para /newdir/newnameno machineA. Isso pressupõe identificação do usuário / senha iguais.

scp MachineA:/path/to/my/otherfile . 

Obtém uma cópia otherfiledo meu diretório MachineA na MachineA e a coloca no meu diretório de trabalho atual na máquina MachineB (designada no modo UNIX padrão pelo caractere "ponto" (.)). Isso pressupõe identificação do usuário / senha iguais.

Se o ID do usuário / senha não forem os mesmos, use:

scp myfile user@MachineA: para obter arquivo.

scp user@MachineA:/path/to/my/otherfile . colocar arquivos

NOTAS sobre SCP:

Assim como o cpcomando, scptem uma opção -p para propagar as configurações de permissão do arquivo original para a cópia (caso contrário, a cópia é feita com as configurações normais para novos arquivos) e uma opção -r para copiar uma árvore de diretório inteira com um comando.

scpcria um canal de dados criptografados completamente transparente entre as duas máquinas, para que os dados binários (como imagens ou programas executáveis) sejam preservados corretamente. Isso também significa que scpnão é possível executar a conversão automática de final de linha entre diferentes tipos de sistemas operacionais, como pode ser feito com o ftp no modo "ascii". Isso não será um problema ao copiar entre sistemas Unix, que usam a mesma convenção de fim de linha.

LukeInDC
fonte
2

se você acessar o servidor via ssh, também poderá se conectar via sftp. Mantenha o cliente filezilla (GUI) à mão e cole o caminho em que você está atualmente

insira a descrição da imagem aqui

jato
fonte
2
Isso se beneficiaria com mais detalhes, incluindo como se conectar a um servidor SSH com o FileZilla (não é óbvio). As capturas de tela também podem ajudar, além do texto explicativo .
Eliah Kagan 08/09/12
2

Se o seu arquivo for pequeno o suficiente, você poderá codificá-lo com base64 e decodificá-lo localmente:

remote.example.net $ base64 <myfile
 (copie a saída)
local.example.net $ base64 -d> myfile
 (copiar a saída)
Ctrl +D

Resposta original de onde eu peguei isso (e testei) em: https://unix.stackexchange.com/a/2869/194134

wesalius
fonte
O que isso tem a ver com alguma coisa? Você não precisa codificar arquivos para txfr-los com scp etc.
HörmannHH
1

Não está na conexão SSH ativa, mas o scp copia os arquivos usando os mesmos mecanismos e permissões que o ssh.

msw
fonte
4
Estou ciente do scp, mas é um fluxo de trabalho muito separado. Se estou trabalhando em um determinado diretório remoto, preciso obter o caminho remoto, desconectar (ou gerar outro shell), fazer a verificação escrevendo os caminhos e reconectando-o. Estou procurando algo semelhante à escrita get filee que apareça magicamente na minha máquina local. Se for necessário fazer isso através de algum serviço encapsulado em SSH, que assim seja ... Mas deve ser vinculado à sessão.
Oli
Além disso, ele foi substituído pelo SFTP (ver minha resposta)
Olivier Lalonde
@Oli - Como as duas extremidades da transação são caixas * nix, elas provavelmente estão em sshdexecução e, portanto, você deve poder usar scpna linha de comando do servidor para enviar arquivos de volta ao cliente. Há tanta mágica para dar a volta; às vezes ainda precisamos apertar os botões. A solução FileZilla também é útil.
Zerobandwidth 13/09/2015
1

Isso não é possível com uma sessão ssh padrão, mas você pode usar um script em vez do ssh, que inicia algo como um servidor ftp ou rsh simples no sistema local e executa o ssh com as opções necessárias para configurar um túnel de volta à sua área de trabalho para conectar a este servidor.

JanC
fonte
Ou poderia apenas scp / rsync ...
HörmannHH
1

konsole possui essa capacidade através do menu "Editar-> Upload do ZModem" enquanto você estiver em uma sessão remota (ou Ctrl-Alt-U).

Observe: o pacote lrzszdeve ser instalado primeiro. Para mim, parece que funciona apenas para o upload de arquivos ASCII.

jato
fonte
0

Como você está se conectando a partir de uma área de trabalho, acho que você pode abrir um segundo terminal.

É assim que costumo fazer:

  • do primeiro terminal, aquele em que a sessão ssh está em execução, eu obtenho o caminho completo do arquivo que preciso obter, usando um realpath myfileou outro readlink -f myfile(versões mais antigas do Ubuntu não pré-instalam realpath) e copio-o.
  • do segundo terminal que uso scpou sftppara obter o arquivo, colando o caminho completo que obtive antes. Por exemplo:scp user@host:/etc/some/file ./

É bastante básico, mas também é fácil de lembrar e não precisa de nenhum pacote extra para funcionar.

obtenha o caminho completo do primeiro terminal e cole no segundo terminal

gerlos
fonte
Não ajuda com o problema "tentar obter um arquivo raiz e efetuar login diretamente pelo root não é permitido" colocado na pergunta.
Oli
0

Surpreendentemente, não vejo nenhuma menção ao bom e velho comandante da meia-noite aqui. Na minha opinião, é provavelmente o gerenciador de arquivos mais universal e útil para shell com recursos de energia, uma das ferramentas "necessárias" para o caso, o que também permite que você se conecte através de SSH, FTP e SFTP, enquanto estiver No segundo painel, você pode abrir qualquer outro sistema de arquivos (local) e trabalhar com arquivos livremente.

Tudo que você precisa é: apt-get install mc (from universe)

Depois disso, execute mc, abra o menu do painel esquerdo ou direito, escolha a conexão shell, digite o nome de usuário @ remote-ip, a senha - na verdade, é isso. Copie (aqui: download) arquivos / pastas de uma máquina para outra com F5, mova-se com F6 e assim por diante, de acordo com os botões abaixo. Para usuários antigos do MS: assim como no NC for DOS

Nex0
fonte
-2

MUITO pensando demais, pessoal. Eu estava procurando por todas as respostas profundas, sombrias e complexas também. Acontece que você pode fazer isso diretamente do Dolphin diretamente da lata. fish: // nome_do_usuário @ servidor: porta

Vencedor
fonte
Eu não entendi
Pierre.Vriens 15/10
Eu não acho que você entenda meu caso de uso. Estou em uma sessão ativa de linha de comando SSH e quero enviar um arquivo de volta ao meu computador local a partir de um local [potencialmente privilegiado, ou seja, não disponível no SFTP]. Pode até não ser um arquivo em sua origem, pode ser uma saída de comando. Estou procurando uma maneira de canalizá-lo de volta sem criar arquivos intermediários e iniciar novas sessões de SFTP / SCP / etc.
Oli