Obtém arquivos do servidor a duas etapas de distância [fechado]

14

Temos a seguinte situação:

  1. Minha máquina
  2. Uma máquina de gateway
  3. A máquina de destino

Não tenho direitos de root nos dois e três. Eu também não posso realmente armazenar informações (não mais que 200 MiB) na máquina # 2 (já que é para ser um gateway para o resto da rede, não mais que isso). Na máquina # 3 existe uma pasta, com cerca de 3 GiB de tamanho, que eu quero copiar para o local. Não consigo SSH de # 1 a # 3, mas posso SSH para # 2 e depois para # 3. Também não é possível configurar um par de chaves privado público entre # 2 e # 3, mas há um par de chaves instalado entre # 1 e # 2.

Normalmente, uso a combinação de SSH e tar para fazer isso:

ssh name@host "tar cf - folder" > folder.tar

Mas, neste caso, isso exigiria algum tipo de aninhamento, e não consigo fazer isso.

Então, qual seria uma boa maneira de obter os dados de nº 3 para nº 1?

    
por Cheiron 21.09.2017 / 10:14

2 respostas

27

Você pode criar um túnel SSH através da máquina2 e, em outra sessão, conectar-se ao túnel.

Por exemplo, abra duas sessões CLI na máquina1. Na primeira sessão, execute o seguinte:

MACHINE1$ ssh -L 2022:MACHINE3:22 <user>@MACHINE2

Na segunda sessão, execute o seguinte:

MACHINE1 $ ssh -p 2022 <user>@localhost

O que está acontecendo com o primeiro comando é que uma porta local (2022 na máquina1) está sendo encapsulada na porta 22 na máquina3 usando sua conexão SSH para a máquina2.

Com o segundo comando, você está se conectando à porta local recém-aberta (2022) e é como se estivesse se conectando diretamente à máquina3.

Agora, se você quiser usar seu processo típico de transferência de arquivos, faça o seguinte:

ssh -p 2022 <user>@localhost "tar cf - /path/to/remote/directory/" > filename.tar

Como alternativa, você pode se familiarizar com o rsync e fazer algo assim:

rsync -aHSv --progress -e 'ssh -p 2022' <user>@localhost:/path/to/remote/directory/ /path/to/local/directory/

Assumindo que o objetivo final não é obter um tarball.

    
por 21.09.2017 / 11:01
5

Você também pode usar o recurso de sessão principal de versões mais recentes do SSH. Está descrito aqui:

link

Provavelmente tudo que você precisa é editar / criar seu arquivo .ssh / config. Adicione definições que controlam as sessões principais:

ControlMaster auto
ControlPath ~/.ssh/cm_socket/%r@%h:%p
ControlPersist 4h
ServerAliveInterval 30

Em seguida, você pode especificar sua definição de servidor do primeiro salto, como:

Host first_hop
Hostname <your first host FQDN or IP>
User <your user>

E o segundo salto usará seu primeiro servidor de saltos como proxy:

Host second_hop
Hostname <your second host FQDN or IP>
User <your user>
ProxyCommand ssh -W %h:%p first_hop

Não se esqueça de criar o diretório ~ / .ssh / cm_socket e as permissões de configuração devem ser 644.

Em seguida, você deve poder enviar SSH ou SCP diretamente para / de seu segundo servidor. Pode haver mais servidores encadeados assim.

    
por 21.09.2017 / 12:03