transferindo arquivos pela sessão SSH de dois saltos

6

Eu tenho uma caixa do Linux no trabalho que geralmente faço login em casa. A caixa do Linux está em uma rede interna, mas há uma caixa que abrange as duas redes, para que eu possa fazer o login assim:

ssh -tA [email protected] ssh [email protected]

Eu tenho alguns arquivos em ~ / tmp que gostaria de copiar para minha máquina local. (vamos chamá-los de ~ / tmp / file1 ~ / tmp / file2 e ~ / tmp / file3 por causa do argumento)

Eu já vi algo parecido com este trabalho:

ssh -tA [email protected] ssh [email protected] 'tar cf - ~/tmp/file*' | tar xf -

Isso colocaria os arquivos na máquina remota, enviaria o resultado para o stdout e, em seguida, canalizaria os resultados para um tar local, que estava descompactando os dados no stdin local.

Não funciona:

Na máquina remota, se eu correr

tar cf - tmp/file* | md5sum
f1b776364c10dfc20500f228399a7c63  -

Da máquina local:

ssh -tA [email protected] ssh [email protected] 'tar cf - ~/tmp/file*' | md5sum
bc7436c9771ee2b4978ffd29b8b7ed36  -
Estou supondo que isso é provavelmente um byte ordenando snafu através da rede ... Eu finalmente fui capaz de contornar isso uuencoding o arquivo, catting-lo através da rede, em seguida, uudecoding localmente ... por algum motivo eu não consegui obter a sintaxe correta para poder tar | uuencode no lado remoto e uudecode | untar no lado local.

Estou procurando uma boa maneira de fazer isso tudo de uma vez; de preferência, algo que eu possa embrulhar em uma função de shell.

    
por Barton Chittenden 11.10.2011 / 15:08

3 respostas

6

Use a opção de configuração SSH ProxyCommand na configuração do seu cliente. Isso permite que você faça uma conexão direta com o destino.

Host remotebox
    ProxyCommand /usr/bin/ssh [email protected] "/bin/netcat -w 1 10.10.10.130 22"
    User username

remotebox scp: arquivo local

    
por 11.10.2011 / 18:17
6

Você pode configurar o encaminhamento de porta. Altere seu comando inicial para:

ssh -TA [email protected] -L 2222:10.10.10.130:22

Então ignore este comando. Abra um novo terminal e execute um dos seguintes:

ssh -p 2222 [email protected]
scp -P 2222 [email protected] remote_file local_file

Sempre que o sistema local obtiver uma solicitação de conexão na porta 2222 do endereço IP do host local, o comando SSH que você executou primeiro encaminhará para o sistema remoto e solicitará uma solicitação de conexão para 10.10.10.130. Isso é tudo especificado pela opção -L.

    
por 11.10.2011 / 23:14
4

O pedido de bytes aplica-se apenas a itens como cabeçalhos IP (que têm endereços de quatro bytes como uma única unidade), mas não afeta protocolos de camada superior que trabalham somente com bytes de 8 bits - IP, TCP, e o SSH garante que você receba os dados exatamente como foram enviados, byte por byte.

O problema é causado pela opção -t para o primeiro ssh . Ele força a alocação de uma pseudo-tty para a primeira conexão, que é necessária apenas para terminais (e emuladores de terminal) e manipulará certos dados durante a transferência. Em particular, retornos de carro (0x0D) serão inseridos automaticamente antes de cada alimentação de linha (0x0A).

Basta remover a opção -t e você terá um canal limpo para transferir dados binários.

    
por 11.10.2011 / 15:24

Tags