Obter arquivos do servidor a dois passos de distância [fechado]

14

Temos a seguinte situação:

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

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

Normalmente eu 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 parece que não consigo fazer isso.

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

Cheiron
fonte

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 da 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 na 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.

Gene
fonte
2
O uso ProxyCommande ssh -Wos dois sshcomandos podem ser combinados em uma única linha de comando. Se você possui uma versão muito recente do cliente OpenSSH, há um argumento que permitirá fazer tudo isso com um único sshcomando.
precisa saber é o seguinte
+1 para rsync;)
NieDzejkob 22/09
Eu uso o tar porque transferir muitos arquivos leva mais tempo do que transferir um arquivo grande. O rsync resolve isso?
Cheiron 24/09
Ao fazer transferências remotas, o rsync verifica os dados em trânsito (no lado de recebimento, antes de gravá-los no disco), portanto, leva mais tempo para transferir um arquivo. No entanto, esse é um tempo bem gasto.
Gene
5

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

https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Multiplexing

Provavelmente, tudo o que você precisa é editar / criar seu .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 de primeiro salto como:

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

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

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

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

Em seguida, você poderá SSH ou SCP diretamente de / para seu segundo servidor. Pode haver mais servidores encadeados como este.

Jaroslav Kucera
fonte
3
Desde a leitura do seu link, não acho que a Multiplexação / ControlMasterseja necessária para o proxy. A página mais relevante desse wikibook é esta: en.wikibooks.org/wiki/OpenSSH/Cookbook/Proxies_and_Jump_Hosts
IMSoP
Sim eu concordo. Existem várias maneiras. No entanto, considero a sessão Master a mais elegante. É apenas sobre preferências pessoais ;-)
Jaroslav Kucera
Um ou outro de nós tinha entendido algo errado. Tanto quanto posso ver, a "conexão principal" é sobre o uso eficiente dos recursos de rede e não tem nada a ver com a questão. Não é uma maneira diferente de fazer isso, é apenas irrelevante para a tarefa em questão.
IMSOP