arquivos scp entre hosts por intermédio

1

Eu tenho acesso a 3 máquinas, A, B e C. As únicas conexões possíveis (ssh) são:

A - > B

A - > C

Eu preciso obter arquivos de B para C, só posso scp os arquivos de A para B (em A: scp local remoto), e depois de A para C (em A: scp local remote). No entanto, A não possui espaço em disco suficiente para alguns arquivos grandes. Firewall entre B e C, bem como o caminho inverso de B - > A e C - > A. e eu não sou capaz de colocar as chaves em B ou C para minha conexão de A para B e C. (longa história, outra questão)

Existe uma maneira de scp o arquivo em B para C, canalizando a saída scp entre A e B diretamente para um scp de A para C? tal o arquivo real não é armazenado localmente?

Olhando para a saída detalhada, a opção -3 parece enviar um comando scp remoto para o host remoto B. que falha por causa do firewall intermediário que bloqueia a conexão.

    
por early_morning_question 01.05.2014 / 12:54

4 respostas

0

Você pode usar um túnel SSH reverso para isso:

No host A, execute:

ssh -R 3000:ip.of.host.c:22 ip.of.host.b

No host B, execute

scp -P 3000 /source/file username@localhost:/destination_file

Isto irá criar um túnel, escutando no host B, que encaminha através do host A para o host C. Então você pode usar localhost: 3000 no host B para fazer conexões ao hostc: 22.

    
por 01.05.2014 / 13:06
0

Você pode usar uma versão do tar-ssh-tar técnica para fazer isso. Do servidor A, execute este comando:

ssh B 'cd /src && tar cf - file1 file2...' | ssh C 'cd /target && tar xvf -'

Isso cria um fluxo de dados no formato tar em B contendo os arquivos, os canais que são transmitidos de volta para A através de SSH, depois para C através de SSH, e então para o programa tar em C que descomprime os arquivos. Nenhum arquivo precisa ser armazenado em A.

Você deve configurar as chaves SSH para B e C, para que não seja solicitada uma senha. Dois ssh instâncias solicitando uma senha ao mesmo tempo será confuso.

Se esta for uma transferência de longa distância, você pode tentar compactar o fluxo de tarts para acelerar:

ssh B 'cd /src && tar zcf - file1 file2...' | ssh C 'cd /target && tar zxvf -'
    
por 01.05.2014 / 15:27
0

Eu acho que a solução mais fácil é fazer um pipe nomeado no pc A. Um pipe nomeado é um arquivo que se comporta como um pipe padrão, ie ele passa ao longo de conteúdo assim que estiver disponível, sem armazenar nada per se . É um meio padrão de implementar o IPC, Inter Process Communication, nos sistemas * Nix.

  mkfifo my-pipe

cria um pipe nomeado com o nome my-pipe . O único problema é que você não pode scp um pipe nomeado (o sistema operacional irá reclamar que o my-pipe não é um arquivo normal). Portanto, a maneira de fazer isso é: em um terminal no pcA, emita o seguinte comando:

  cat my-pipe | ssh me@pcC 'cat > /path/to/destination/file'

Este comando transmite o conteúdo do pipe nomeado para o pcC, e isso é redirecionado para o arquivo de destino.

Em outro terminal, novamente no pcA, problema:

  ssh me@pcB 'cat /path/of/source/file' > my-pipe

Este comando coloca na saída padrão o arquivo de origem localizado no pcB remoto e o redireciona para o pipe nomeado.

O pipe nomeado é esvaziado assim que o material entra. O fim do arquivo de pcB fecha ambas as conexões, para B e para C. Nada é armazenado em A. Neste ponto, você pode remover o tubo,

 rm my-pipe. 

Parece-me bastante simples.

    
por 01.05.2014 / 16:22
0

Se você fizer isso com frequência, sugiro adicionar um comando de proxy no seu arquivo de configuração ssh no servidor A localizado em ~/.ssh/config da seguinte forma:

host serverB
User <user on B>
HostName <hostname of B>

host serverC
User <user on C>
ProxyCommand ssh -q serverB nc -q0 <C hostname> 22

-q é para o modo silencioso, o que significa menos saída.

Agora, quando quiser copiar arquivos da máquina A para a máquina C, tudo o que você precisa fazer é digitar scp file1 file2 .. serverC:/some/path . Você também pode fazer isso no servidor C, se quiser fazer isso inversamente. Isso é especialmente útil se você tiver nomes de usuários diferentes nas diferentes máquinas e, claro, também pode ser combinado com ssh-copy-id, se você não quiser inserir sua senha todas as vezes.

    
por 17.03.2016 / 23:49