Jak mogę pobrać plik z hosta, do którego mogę tylko SSH za pośrednictwem innego hosta?

30

Chcę pobierać pliki z komputera biurowego na laptopa.

Mogę połączyć mój komputer biurowy przez SSH z serwerem organizacji, a następnie SSH z serwera do mojego komputera biurowego.

Jedynymi poleceniami, które serwer organizacji akceptuje, są ssh, ssh1 i ssh2.

Jak mogę pobrać plik z mojego komputera (zdalnego) przez serwer na mój laptop (lokalny)?

Yochay Magan
źródło
2
Używać odwrotnych tuneli SSH? Zobacz moją odpowiedź tutaj i dostosuj ją w razie potrzeby: superuser.com/questions/1186905/…
Darren
1
multi-hop SSH?
mckenzm

Odpowiedzi:

37

Poprzednie odpowiedzi wspominają, jak korzystać z dyrektywy ProxyJump (dodanej w OpenSSH 7.3) do łączenia się przez serwer pośredni (zwykle nazywany hostem bastionu), ale wspominają o tym tylko jako argumentie wiersza poleceń.

Jeśli nie jest to maszyna, z którą nie będziesz się w przyszłości podłączać, najlepszą rzeczą jest skonfigurowanie jej ~/.ssh/config.

Umieściłbym plik taki jak:

Host office-machine
Hostname yochay-machine.internal.company.local
ProxyJump bastion-machine

Host bastion-machine
Hostname organization-server.company.com
...

Jeśli używasz wcześniejszej wersji OpenSSH, która nie obsługuje ProxyJump, zastąpisz ją odpowiednikiem:

ProxyCommand ssh -W %h:%p bastion-machine

a jeśli Twoja lokalna wersja ssh była naprawdę starą wersją, która nie obsługiwała -W:

ssh bastion-machine nc %h %p

chociaż ten ostatni wymaga nczainstalowania maszyny bastionowej .

Zaletą ssh jest to, że możesz skonfigurować każde miejsce docelowe w pliku i będą się ładnie układać. W ten sposób skończysz office-machinejako nazwa hosta dla wszystkich narzędzi (ssh, scp, sftp ...), ponieważ były to bezpośrednie połączenia, a oni dowiedzą się, jak się połączyć w oparciu o ssh_config. Możesz także Host *.internal.company.localużyć symboli wieloznacznych, które sprawią, że wszystkie hosty kończące się w ten sposób przejdą przez określony bastion, i będzie to dotyczyć wszystkich z nich. Po prawidłowym skonfigurowaniu jedyną różnicą między wykonaniem jednego przeskoku lub dwudziestu byłoby wolniejsze czasy połączenia.

Anioł
źródło
36

Jeśli masz najnowszą wersję OpenSSH (8.0), możesz użyć przełącznika -J(skok) :

scp -J user@intermediate user@target:/path

W starszych wersjach (ale co najmniej 7.3) możesz użyć ProxyJumpdyrektywy w wierszu poleceń:

scp -o ProxyJump=user@intermediate user@target:/path

lub w ssh_configpliku, jak pokazuje odpowiedź @ Ángel.


Istnieją inne opcje, takie jak ProxyCommandprzekierowanie portów, z których można korzystać nawet w starszych wersjach OpenSSH. Są one omówione w artykule Czy OpenSSH obsługuje logowanie do wielu sklepów?

Martin Prikryl
źródło
2
@yochaymaganssh -J userA@orgserv userB@officecomp cat remote/path > local/path
mosvy
4
Do SCP został dodany w 7.10
Ángel
4
Nawet jeśli scpnie obsługuje -J, może być wystarczająco nowy, aby obsługiwać tę ProxyJumpopcję; wypróbuj jedną z pozostałych odpowiedzi, które wyraźnie korzystają z tej opcji.
Gordon Davisson
2
To powinna być zaakceptowana odpowiedź. Nienawidzę wszystkich odpowiedzi na sshpytania, które sugerują modyfikację twojego configdla konkretnych hostów, gdy wystarczy prosta opcja wiersza poleceń, aby wykonać zadanie.
clemisch
2
„Pogarda” wydaje się ekstremalną reakcją. Jasne, są przypadki, w których szybka modyfikacja wiersza poleceń jest łatwiejsza niż konieczność pierwszej modyfikacji pliku konfiguracyjnego. Ale jeśli planujesz połączyć się z tym samym hostem wiele razy, z pewnością wolę zaktualizować mój plik konfiguracyjny raz, niż używać go za -J user@intermediatekażdym razem, gdy muszę się połączyć.
chepner
10

Czasami możemy po prostu użyć potoku. Ten czas jest dzisiaj.

ssh -A user@host1 ssh user@host2 cat filename > filename

Możesz również przesłać

ssh -A user@host1 ssh user@host2 cat \\\> filename < filename

Tak, istnieją inne rozwiązania obejmujące proxy, itp., Ale wiedza, jak to zrobić, jest przydatna.

Jozuego
źródło
Przydatne użycie cat!
Piskvor
Pamiętaj, że daje to każdemu odpowiednio uprzywilejowanemu użytkownikowi hosta pośredniego dostęp do agenta ssh i kluczy. Dane przepływające między hostem a hostem 2 również będą istniały niezaszyfrowane na hoście1. Metody wykorzystujące proxy i przeskocz powyżej pozwalają uniknąć obu tych problemów.
James
@james: Nie jestem nieświadomy. Tacy gospodarze Bastion są zwykle bardzo godni zaufania.
Joshua
7

Użyj ProxyJumpkonfiguracji:

ProxyJump
Określa co najmniej jeden serwer proxy skoku jako [użytkownik @] host [: port] lub identyfikator URI ssh. Wiele serwerów proxy może być oddzielonych przecinkami i będzie odwiedzanych kolejno. Ustawienie tej opcji spowoduje, że ssh (1) połączy się z hostem docelowym, najpierw nawiązując połączenie ssh (1) z określonym hostem ProxyJump, a następnie ustanawiając stamtąd przekazywanie TCP do ostatecznego celu.

scp -o ProxyJump=user@intermediate user@target:/path
RalfFriedl
źródło
2

Istnieje starożytny protokół o nazwie ZMODEM : obecnie niewiele programów go obsługuje, ale gdy działa, może być całkiem wygodny.

Najpierw sprawdź, czy program terminala twojego laptopa obsługuje ZMODEM. (Na przykład możesz skonfigurować iTerm2 (na Macu) do obsługi ZMODEM. Przykładowy skrypt jest dostępny tutaj .)

Na komputerze biurowym uruchom: sudo apt install lrzsz

Teraz wszystko, co musisz zrobić, to ssh na komputer biurowy i uruchomić sz (filename). Plik zostanie pobrany za pośrednictwem twojego terminala.

jick
źródło
1

Konfiguracja pod ssh użytkownika: ~/.ssh/config

Host *
    UserKnownHostsFile=/dev/null
    StrictHostKeyChecking=no
    ServerAliveInterval 300
    ServerAliveCountMax 2
    ForwardAgent yes


Host jump server
    HostName server.company.org
    User root

Host jump1 server1
    HostName server1.dmz.company.org
    User root
    ProxyJump jump

Host jump2 server2
    HostName server.dmz2.company.org
    User root
    ProxyJump jump1

Host *.intranet.company.org
    User user
    ProxyJump jump2

Możesz teraz skopiować z serwera intranetowego bezpośrednio na serwer 3 skoków.

scp [email protected]:/home/user/ ./*

Preferuję to, ponieważ nie trzeba już określać serwerów skoku za pomocą scp

Lukáš Viktora
źródło
0

Przez SCP -3:

scp -3 user1@remote1:/root/file1.txt user2@remote2:/root/file1.txt
wuseman
źródło
2
-3Rozwiązaniem jest opisany jako „kopii między dwoma oddalonymi gospodarzy są przesyłane do lokalnego komputera”. podczas gdy uważam, że to pytanie stanowi, że lokalny host nie może uzyskać dostępu do „remote2”.
Jeff Schaller
2
@JeffSchaller: łączysz się z maszyną na środku, a następnie używasz -3. Zakłada się jednak, że można połączyć się ze środkowej maszyny z powrotem do pierwszej.
Joe
Nie widzę w tym żadnej przewagi nad -J/ JumpHost. Wręcz przeciwnie, ponieważ ma ograniczenia, o których wspomina @Joe.
Martin Prikryl