Vraag Hoe voer ik Multihop SCP-overdracht uit?


Ik wil een bestand van mijn computer A naar server C kopiëren, maar heb alleen via server B toegang tot server C.

In plaats van eerst naar server B over te zetten, in te loggen en vervolgens over te zetten naar server C, is het mogelijk om het bestand rechtstreeks met SCP of soortgelijke programma's over te dragen?

(De tramp-modus van Emacs heeft deze functie voor het op afstand bewerken van bestanden).


76
2017-07-08 12:09


oorsprong




antwoorden:


Veronderstel OpenSSH, voeg toe aan je SSH-configuratie in .ssh / config

Host distant
ProxyCommand ssh near nc distant 22

Dit zorgt ervoor dat SSH 'direct' verbinding kan maken met de machine met de naam distant door proxy's door de dichtstbijzijnde machine te sturen. Het kan dan applicaties zoals scp en sftp gebruiken op de verre machine.

Om dit te laten werken heb je 'nc' oftewel netcat geïnstalleerd op de machine met de naam near. Maar veel moderne systemen zullen het al hebben.

towo's tar-oplossing is effectiever voor one-shot-problemen, ervan uitgaande dat je de syntaxis en werkingsregels van tar hebt onthouden.


43
2017-07-08 12:25



Dit is dezelfde methode die ik gebruik ... In dit voorbeeld zou 'ver' server C zijn en 'near' zou server B zijn voor opheldering ... - Jeremy Bouse
Veel moderne machines hebben geen 'nc': het is normaal gesproken alleen beschikbaar voor Linux-machines en alleen op verzoek (geen onderdeel van de standaardinstallatie). - Mei
ssh heeft nu -W optie, dat doet dit automatisch zonder 'nc', maar ik vraag me af waarom er geen scp -W is - kubanczyk
In het geval dat ik niet de enige ben, was dit niet vanzelfsprekend: als de gebruikersnaam aan stond near is anders dan de gebruikersnaam distant, de bijna-gebruiker gaat erin ProxyCommand ssh nearuser@near..., en de verre gebruiker gaat naar een afzonderlijke User distantuser lijn. - Mu Mind
Typ gewoon ssh multi hope en druk op Google Ik heb geluk - chandank


Je kan toevoegen -o opties om scp in plaats van .ssh/config.

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

$jump_host is uw "server B" in dit geval.


41
2018-01-11 17:30



Dit is mijn favoriete manier om dit te doen. Het opruimen van .ssh / config voor multihopping is niet de beste oplossing als u dezelfde host benadert vanaf een gateway en rechtstreeks. - GabrieleV
geweldig fragment ... Bedankt ... - Paul T.
Hoe dit zou zijn met verschillende / aangepaste gebruikersnamen en poorten? - Pablo Bianchi


Bij recentere versies van ssh op de server in de buurt van (B) -machine werkt het volgende zonder netcat:

Host distant
    ProxyCommand ssh near -W distant:22

Het vereist echter dat AllowTcpForwarding ja is (de standaardinstelling) op de nabije (B) machine

edit: vereist OpenSSH 5.4+ op B


19
2018-03-20 01:04



werkt perfect :) - gongzhitaao
En vanaf OpenSSH 7.4p1 op zijn minst is er een "ProxyJump" -opdracht waarin men slechts elke user @ host lijst hoeft te vermelden: poort gescheiden met komma's. Leuk! - hmijail
ProxyJump is leuk, maar het heeft de Gebruiker en IdentityFile niet uit het configuratiebestand gehaald. ProxyCommand -W doet dit en werkt ook met scp. - rickfoosusa


Je kunt ssh naar server B gebruiken met zoiets

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

Dan kunt u ssh naar server C gebruiken

ssh -p 5022 <user_serverC>@localhost 

Op dezelfde manier zou scp werken met

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

Vergeet niet om het juiste geval van p te gebruiken met scp en ssh


15
2017-07-08 13:02





Als je echt slecht wilt zijn, zou je ssh en tar kunnen ketenen, zoiets als tar c mydir | ssh server "ssh otherserver | tar x", maar dit kan tegen alle problemen aanlopen.

De gemakkelijkere manier zou zijn om gewoon een SSH-tunnel op te zetten met de ingebouwde methoden van SSH; kijk naar de -D schakel de manpage in en stuur gewoon een poort naar de ssh-poort van de andere server.


3
2017-07-08 12:16





Het is mogelijk en relatief gemakkelijk, zelfs wanneer u certificaten voor verificatie moet gebruiken (typisch in AWS-omgevingen).

De onderstaande opdracht kopieert bestanden van a remotePath op server2 direct in je machine op localPath. Intern wordt het scp-verzoek via proxy uitgevoerd server1.

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

Andersom werkt ook (upload bestand):

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

Als u in plaats daarvan wachtwoordverificatie gebruikt, probeert u dit met

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

Als u dezelfde gebruikersreferenties op beide servers gebruikt:

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

2
2017-10-08 01:24





U kunt dit ook omgekeerd doen en is misschien eenvoudiger.

Stel dat je een SSH-sessie hebt geopend met de machine waarnaar je het bestand wilt sturen. Deze verst-hop-pc noemen we deze hop2. Uw "proxy" -host zal hop1 zijn. De pc die van oorsprong is, we zullen die oorsprong noemen.

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

U kunt tunnels maken door een lokale poort beschikbaar te maken op een externe pc. Hiermee definiëren we een poort die moet worden geopend op de externe pc, die een omleiding zal zijn naar de poort die u bij u hebt getrokken toen u de tunnel bouwde.

Op 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

Nu in die geopende tunnelsessie kun je hetzelfde doen van hop1 naar bestand_origin.

Op 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.

Je bent nu getunneld van hop2 naar hop1 naar herkomst. Toevallig zijn nu zowel poort 5555 als 6666 open op basis van herkomst, wat omleidingen zijn naar hop2's poort 22. Binnen deze sessie zijn beide van de volgende geldige scp-routes naar hop2:

Op oorsprong:

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

Op deze manier kun je een willekeurig aantal hops hebben, en het is gemakkelijker om mee te werken als je meer dan twee hops samenvoegt.


2
2017-11-18 20:22





Probeer het volgende voorbeeld openssh config aan te passen voor een setup die voor meerdere hosts kan worden gebruikt:

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

Dit veronderstelt een set servers die beginnen met "uat-" die alleen toegankelijk zijn via de jumpbox / gateway-server "bastion-uat". Je wilt waarschijnlijk ook toevoegen ForwardAgent yes als u een sleutel gebruikt om in te loggen.


1
2018-06-25 10:33



Niet gebruiken ForwardAgent yes voor deze. Het doorsturen van agents is in dit geval niet nodig omdat er geen ssh-client op het bastion wordt uitgevoerd en als een agent wordt doorgestuurd wanneer dit niet nodig is, gaat dit de beveiliging alleen maar verminderen. En ik denk ssh ontbreekt in uw opdracht. Als een recente ssh versie wordt gebruikt die u niet nodig hebt nc, jij kan typen ssh -W %h:%p bastion-uat in plaats daarvan. - kasperd
@kasperd Bewerkt om ssh op te nemen. Re ForwardAgent; een ssh-client wordt uitgevoerd om het nc-commando zelf uit te voeren. Misschien verwijst u naar de schaal? - Benjamin Goodacre


Dit is geen scp (waarvoor OP gevraagd), maar ik vond het super eenvoudig om te gebruiken rsync kopiëren van lokaal naar extern via een enkele hop met:

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

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

Ik had de -o ProxyPass suggestie hierboven geprobeerd en wilde de configuratie niet veranderen voor mijn veranderende behoeften. Zoals de auteur in de bovenstaande link aangeeft, is het doelbestand dat aan de dubbele punt (:) voorafgaat, belangrijk om aan te geven dat het opgegeven pad zich op de doelserver bevindt. Ook heb je met rsync de opties datum vergelijken, mapsynchronisatie enz. Ik hoop dat dit iemand helpt!


1
2017-12-21 17:07