Como faço transferências do Multihop SCP?

85

Quero copiar um arquivo da minha máquina A para o servidor C, mas só tenho acesso ao servidor C através do servidor B.

Em vez de primeiro transferir para o servidor B, efetue login e depois transfira para o servidor C. É possível transferir o arquivo diretamente com o SCP ou programas similares?

(O modo tramp do Emacs possui esse recurso para editar arquivos remotamente).

sverrejoh
fonte

Respostas:

48

Você pode adicionar -oopções ao scpinvés de .ssh/config.

scp -o ProxyCommand="ssh $jump_host nc $host 22" $local_path $host:$destination_path

$jump_host é o seu "servidor B" neste caso.

John Tantalo
fonte
Essa é a minha maneira preferida de fazer isso. Desarrumar .ssh / config para multihopping não é a melhor solução se você acessar o mesmo host a partir de um gateway e diretamente.
26411 GabrieleV
Como isso seria com nomes de usuário e portas diferentes / personalizados?
21419 Pablo A
Eu tento isso e deve inserir a senha. Como posso consertar isso. Obrigado.
hqt 1/07
44

Supondo que o OpenSSH, adicione à sua configuração SSH em .ssh / config

Host distant
ProxyCommand ssh near nc distant 22

Isso fará com que o SSH consiga conectar-se "diretamente" à máquina nomeada distante, fazendo proxy por meio da máquina nomeada near. Em seguida, ele pode usar aplicativos como scp e sftp na máquina distante.

Para que isso funcione, você precisa do 'nc' aka netcat instalado na máquina chamada near. Mas muitos sistemas modernos já o terão.

A solução de tar do towo é mais eficaz para problemas de uma só vez, assumindo que você memorizou a sintaxe e as regras de operação do tar.

tialaramex
fonte
Este é o mesmo método que eu uso ... Neste exemplo 'distante' seria servidor C e 'perto' seria servidor B para o esclarecimento ...
Jeremy Bouse
Muitas máquinas modernas não possuem 'nc': normalmente está disponível apenas para máquinas Linux e somente mediante solicitação (não faz parte da instalação padrão).
Mei
1
ssh tem opção agora -W, que faz isso automaticamente, sem 'NC', mas eu me pergunto por que não é scp -W
kubanczyk
3
Caso eu não seja o único a quem isso não era óbvio: se o nome de usuário ativado nearfor diferente do nome de usuário ativado distant, o usuário próximo entra ProxyCommand ssh nearuser@near...e o usuário distante entra em uma User distantuserlinha separada .
Mu Mind
Basta digitar ssh vários esperança e pressione Google estou com sorte
chandank
19

Nas versões mais recentes do ssh no servidor próximo à máquina (B), o seguinte funcionará sem o netcat:

Host distant
    ProxyCommand ssh near -W distant:22

No entanto, será necessário permitir que AllowTcpForwarding seja yes (o padrão) na máquina near (B)

editar: requer OpenSSH 5.4+ em B

danblack
fonte
funciona como um encanto :)
gongzhitaao 19/09/13
1
E a partir do OpenSSH 7.4p1, no mínimo, existe um comando "ProxyJump" no qual apenas é necessário listar cada usuário @ host: porta separada por vírgulas. Agradável!
precisa saber é o seguinte
O ProxyJump é bom, mas não tirou o Usuário e o IdentityFile do arquivo de configuração. O ProxyCommand -W faz isso e também funciona com o scp.
Rickfoosusa 18/06/19
18

Você pode ssh no servidor B usando algo como

ssh -L 5022:<server C IP>:22 <user_serverB>@<server B IP>

Em seguida, você pode ssh no servidor C usando

ssh -p 5022 <user_serverC>@localhost 

Da mesma forma, o scp funcionaria usando

scp -P 5022 foo.txt <user_serverc>@localhost:

Lembre-se de usar o caso correto de p com scp e ssh

Saurabh Barjatiya
fonte
5

É possível e relativamente fácil, mesmo quando você precisa usar certificados para autenticação (típico nos ambientes da AWS).

O comando abaixo irá copiar arquivos de um remotePathem server2diretamente em sua máquina a localPath. Internamente, a solicitação scp é enviada por proxy server1.

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

O contrário também funciona (upload de arquivo):

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" <localpath> user2@server2:/<remotePath>

Se você usar a autenticação por senha, tente com

scp -o ProxyCommand="ssh -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

Se você usar as mesmas credenciais do usuário nos dois servidores:

scp -o ProxyCommand="ssh -W %h:%p commonuser@server1" commonuser@server2:/<remotePath> <localpath>
donhector
fonte
3

Se você quer ser realmente malvado, pode encadear ssh e tar, algo assim tar c mydir | ssh server "ssh otherserver | tar x", mas isso pode ter todas as mãos de problemas.

A maneira mais fácil seria apenas configurar um túnel SSH com os métodos internos do SSH; observe o -Dcomutador na página de manual e encaminhe alguma porta para a porta ssh do outro servidor.

towo
fonte
2

Você também pode fazer isso ao contrário e talvez seja mais fácil.

Supondo que você tenha uma sessão ssh aberta com a máquina para a qual deseja enviar o arquivo. Esse PC que está mais distante, chamaremos isso de hop2. Seu host "proxy" será hop1. O PC que é a origem do arquivo, chamaremos essa origem.

origin:~/asdf.txt  --> hop1 --> hop2:~/asdf.txt

Você pode construir túneis disponibilizando uma porta local em um PC remoto. Assim, definimos uma porta a ser aberta no PC remoto, que será um redirecionamento para a porta que você puxou quando construiu o túnel.

No hop2:

ssh -R 5555:127.0.0.1:22 <hop1_user>@<hop1_IP>
#this has the effect of building a tunnel from hop2 to hop1, making hop2's port 22 available on hop1 as port 5555

Agora, nessa sessão de túnel aberta, você pode fazer o mesmo do hop1 ao file_origin.

No hop1:

ssh -R 6666:127.0.0.1:5555 <origin_user>@<origin_IP>
#this has the effect of building a tunnel from hop1 to origin while also pulling the active tunnel with it, making hop1's port 5555 (hop2's port 22) available on origin as port 6666.

Agora você está no túnel do hop2 para o hop1 até a origem. Coincidentemente, agora as portas 5555 e 6666 estão abertas na origem, que são redirecionadas para a porta 22 do hop2. Nesta sessão, os seguintes são rotas scp válidas para o hop2:

Na origem:

scp -P 6666 ~/asdf.txt <hop2_user>@<127.0.0.1>:~/asdf.txt

Dessa forma, você pode ter um número arbitrário de saltos no meio, e é mais fácil trabalhar com isso em termos de encadear mais de dois saltos.

SYANiDE
fonte
1

Tente adapring o exemplo a seguir openssh config para uma configuração que pode ser usada para vários hosts:

Host uat-*
     ProxyCommand ssh bastion-uat nc %h %p

Isso pressupõe um conjunto de servidores que começam com "uat-" que são acessíveis apenas através do servidor jumpbox / gateway "bastion-uat". Você provavelmente também deseja adicionar ForwardAgent yesse estiver usando uma chave para fazer login.

Benjamin Goodacre
fonte
Não use ForwardAgent yespara isso. O encaminhamento de agente não é necessário nesse caso, porque nenhum cliente ssh estará em execução no bastião, e encaminhar um agente quando não for necessário apenas reduzirá a segurança. E acho que sshfalta o seu comando. Se uma sshversão recente estiver sendo usada, você não precisa nc, você pode digitar ssh -W %h:%p bastion-uat.
kasperd
@kasperd Editado para incluir ssh. Re ForwardAgent; um cliente ssh será executado para executar o próprio comando nc. Talvez você esteja se referindo à concha?
Benjamin Goodacre
1

Isso não é scp (solicitado pelo OP), mas achei super simples rsyncde copiar do local para o remoto em um único salto com:

rsync -v -e 'ssh -A -t user@jumpserver ssh -A -t user@destinationserver' /path/to/sourcefile :/path/to/destination

Fonte: http://mjbright.blogspot.com/2012/09/using-rsync-over-multi-hop-ssh.html

Eu tentei a sugestão -o ProxyPass acima e não queria alterar a configuração para minhas necessidades. Como afirma o autor no link acima, o arquivo de destino que antecede dois pontos (:) é importante para indicar que o caminho especificado está no servidor de destino. Além disso, usando o rsync, você tem as opções de comparação de datas, sincronização de pastas etc. Espero que isso ajude alguém!

texas-bronius
fonte
-2

scp -o 'ProxyJump jumpboxname' somefilename.txt finaldestinationhost: / tmp /.

Eu e
fonte
3
Não basta despejar um pouco de código inexplicável aqui. Há muitas boas respostas para essa pergunta e você precisa agregar valor às existentes - isso não acontece.
Sven