Questão arquivos scp entre hosts através de intermediário


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 para obter arquivos de B para C, só posso scp os arquivos de A para B (em A: scp local remoto) e, em seguida, de A para C (em A: scp local remoto). No entanto, A não possui espaço em disco suficiente para alguns arquivos grandes. Firewall entre B e C, assim como o caminho reverso de B -> A e C -> A. e eu não consigo colocar 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, piping a saída scp entre A e B diretamente em um scp de A para C? tal o arquivo real não é armazenado localmente?

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


1


origem




Respostas:


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.


0





Você pode usar uma versão do técnica tar-ssh-tar 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 em formato de tar em B contendo os arquivos, pipes que são transmitidos de volta para A através de SSH, depois para C até 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ão confusas.

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

ssh B 'cd /src && tar zcf - file1 file2...' | ssh C 'cd /target && tar zxvf -'

0





Eu acho que a solução mais fácil é fazer um tubo nomeado no pc A. Um pipe nomeado é um arquivo que se comporta como um tubo padrão, isto é ele repassa seu 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 nome meu cachimbo. O único problema é que você não pode scp um pipe nomeado (o sistema operacional irá reclamar do fato de o my-pipe não ser um arquivo regular). 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, questão:

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

Esse 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 do pcB fecha as duas 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.


0





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

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, significando menos saída.

Agora, quando você 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ê pode fazer isso no servidor C também se quiser fazer isso de forma inversa. Isso é especialmente útil se você tiver diferentes nomes de usuários 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.


0