Eu tenho acesso a três máquinas, A, B e C. As únicas conexões possíveis (ssh) são:
A -> B
B <-> C
Eu preciso obter arquivos de A a C, para que eu possa scp os arquivos de A para B e depois de B para C. No entanto, B não tem muito espaço em disco, portanto, essa não é uma opção. Existe uma maneira de scp arquivos de A a C via B? Observe que não tenho acesso root em nenhuma das máquinas; portanto, não pense em configurar túneis persistentes, mas corrija-me se estiver errado!
A$ rsync <options> -e 'ssh B ssh' source C:destination
Respostas:
ProxyJump
Novo no OpenSSH 7.3:
(Nos bastidores, isso usa apenas ProxyCommand e
ssh -W
.)ProxyCommand
Atualizado para incluir -W de outras respostas:
Se A tiver um cliente SSH muito antigo instalado (sem
-W
suporte) ou se B estiver configurado para desabilitar o encaminhamento de TCP (mas ainda permitir comandos de shell), use alternativas:Tubos
Para apenas um arquivo:
"Túnel" através de B
Quando terminar, não esqueça de eliminar o
ssh
processo iniciado anteriormente (que caiu em segundo plano devido a-f -N
).-f
Solicita que o ssh volte para o plano de fundo imediatamente antes da execução do comando. Isso é útil se o ssh solicitar senhas ou frases secretas, mas o usuário desejar em segundo plano. Isso implica -n.-N
Não execute um comando remoto. Isso é útil apenas para encaminhamento de portas.Inverta o "túnel" através de B para A
Nem sempre funciona:
-R
Especifica que as conexões com a porta TCP ou o soquete Unix fornecido no host remoto (servidor) devem ser encaminhadas para o host e a porta fornecidos, ou soquete Unix, no lado local.fonte
scp
de C, embora B, a A, poderá fazê-loA$ scp -oProxyJump=B C:destination thefile
.As versões do scp do início de 2011 e posteriores podem ter uma opção "-3":
Se você tiver isso, basta executar:
fonte
Quase tudo já foi dito, mas aqui está o meu último centavo: eu uso a variante ProxyCommand sem
nc
nemsoc
. Baseado no OpenSSH Proxies e no Jumphost Cookbook, criei uma seguinte configuração:Portanto, temos os seguintes jogadores:
Primeiro, adicionei minha chave pública local do meu host doméstico
.ssh/id_dsa.pub
aos hosts de.ssh/authorized_keys
salto e de destino. Sim, a mesma chave pública do host doméstico para os dois. Normalmente, você espera que seja a chave pública HOP que você deve adicionar à chave TARGET.Depois, aprimorei
.ssh/config
um pouco adicionando a seguinte entrada:Depois que a operação de cópia é tão simples como:
scp FILE TARGET_HOST:
. Ele exibe banners duplos dos nós de salto e de destino, mas funciona.Claro que você pode usar acima de ssh diretamente para o alvo:
ssh TARGET_HOST
. Funciona com scp e ssh.Outra opção mais geral pode ser o utilitário sshuttle , que parece ser um tipo de proxy transparente (vpn sobre ssh). Portanto, no seu caso de A-> B <-> C, ele permite conectar-se a cada nó na rede de C: A-> B- [CDEFG]. Ele não precisa de administrador, mas requer Python 2.7 (3.5 também OK), o que nem sempre é o que temos. Vale a pena tentar.
fonte
em outra concha:
Isso está usando o encaminhamento de porta. A única limitação aqui é que o host B precisa ser configurado para permitir o encaminhamento de porta. Caso contrário, isso deve funcionar bem.
Na forma de explicação,
-L
e-R
permitem encaminhar portas. Em-L
, a primeira porta fornecida é a porta ssh começará a escutar na máquina de origem (host A) e encaminhará tudo o que receber nessa porta pela sua conexão SSH para o host B e, em seguida, encaminhará para o host C na porta 22.editar
Eu estraguei a sintaxe um pouco. Ele configura um encaminhamento em sua máquina LOCAL.
fonte
A resposta do ProxyCommand da Grawity funcionou para mim, mas como eu estou menos familiarizado com o SSH, foi preciso experimentar. Eu pensei que apenas explicaria a resposta de Grawity com mais detalhes para ajudar outros novatos no SSH como eu. Aqui estão as definições para uma notação mais explícita:
Máquina A: a máquina em que você está
Servidor B: [email protected] (o host de salto ou o servidor intermediário)
Servidor C: [email protected] (o servidor remoto para o qual você deseja copiar)
ProxyCommnad
Exemplo concreto
Portanto, para um exemplo concreto, digamos que você tenha acesso a um servidor com IP
0.0.1.2
com uma conta de usuário chamadabar
(Servidor C). Mas, para isso, você deve primeiro fazer login em um servidor com IP0.0.1.1
com a conta de usuário chamadafoo
(Servidor B). Agora você deseja copiar o arquivobaz.txt
localizado na sua máquina atual (Máquina A) para0.0.1.2
o/home/bar/
diretório do servidor . Para usar o ProxyCommand acima para este exemplo, você deve executar o seguinte:Você também pode copiar com facilidade o arquivo do Servidor C, alternando a ordem e o destino do arquivo. Assim, por exemplo, se
baz.txt
já estava no servidor0.0.1.2
localizado na/home/bar/
, então você pode copiá-lo para a sua máquina usando:Espero que isso ajude as pessoas que precisam de coisas explicadas um pouco mais do que outras.
fonte