Chcę skopiować plik z mojego komputera A na serwer C, ale mam dostęp tylko do serwera C przez serwer B.
Zamiast najpierw przenieść na serwer B, zaloguj się, a następnie przenieś na serwer C. Czy można przenieść plik bezpośrednio za pomocą SCP lub podobnych programów?
(Tryb Tramp Emacsa ma tę funkcję do zdalnej edycji plików).
Zakładając OpenSSH, dodaj do konfiguracji SSH w .ssh / config
Spowoduje to, że SSH będzie w stanie połączyć się „bezpośrednio” z maszyną o nazwie odległej poprzez proxy przez maszynę o nazwie near. Następnie może używać aplikacji takich jak scp i sftp na odległym komputerze.
Aby to zadziałało, potrzebujesz 'nc' aka netcat zainstalowanego na komputerze o nazwie near. Ale wiele nowoczesnych systemów już to ma.
Rozwiązanie tar tar jest bardziej skuteczne w przypadku problemów jednorazowych, zakładając, że zapamiętałeś składnię tar i zasady działania.
źródło
near
jest inna niż nazwa użytkownika włączonadistant
, użytkownik bliski wchodziProxyCommand ssh nearuser@near...
, a użytkownik zdalny przechodzi do osobnejUser distantuser
linii.W przypadku nowszych wersji ssh na serwerze w pobliżu maszyny (B) następujące działania będą działać bez netcata:
Będzie jednak wymagać, aby AllowTcpForwarding miał wartość yes (domyślnie) na maszynie near (B)
edycja: wymaga OpenSSH 5.4+ na B
źródło
Możesz ssh na serwer B używając czegoś takiego
Następnie możesz ssh na serwerze C.
Podobnie działałoby scp przy użyciu
Pamiętaj, aby używać poprawnego przypadku p dla scp i ssh
źródło
Jest to możliwe i względnie łatwe, nawet gdy trzeba używać certyfikatów do uwierzytelniania (typowe w środowiskach AWS).
Komenda poniżej skopiuje pliki z
remotePath
dniaserver2
bezpośrednio na maszynielocalPath
. Wewnętrznie żądanie scp jest przekazywane przez serwer proxyserver1
.Odwrotnie działa również (przesyłanie pliku):
Jeśli zamiast tego używasz uwierzytelniania za pomocą hasła, spróbuj
Jeśli używasz tych samych poświadczeń użytkownika na obu serwerach:
źródło
Jeśli chcesz być naprawdę niegodziwy, możesz połączyć łańcuchy ssh i tar, coś w tym rodzaju
tar c mydir | ssh server "ssh otherserver | tar x"
, ale może to napotkać wszystkie problemy.Najłatwiejszym sposobem byłoby po prostu ustawienie tunelu SSH z wbudowanymi metodami SSH; spójrz na
-D
przełącznik na stronie man i po prostu przekieruj jakiś port do portu ssh drugiego serwera.źródło
Możesz to również zrobić w odwrotnej kolejności i może to być łatwiejsze.
Załóżmy, że masz otwartą sesję ssh na maszynie, do której chcesz wysłać plik. Ten komputer z najdalszym przeskokiem nazwiemy hop2. Twoim hostem „proxy” będzie hop1. Komputer będący źródłem pliku, nazwiemy to źródłem.
Możesz budować tunele udostępniające port lokalny na zdalnym komputerze. W ten sposób definiujemy port do otwarcia na zdalnym komputerze, który będzie przekierowaniem do portu, który ściągnąłeś ze sobą podczas budowy tunelu.
Na hop2:
Teraz w tej otwartej sesji tunelowej możesz zrobić to samo od hop1 do file_origin.
Na skoku 1:
Jesteś teraz tunelowany od hop2 do hop1 do źródła. Nawiasem mówiąc, teraz zarówno port 5555, jak i 6666 są otwarte w momencie nadejścia, które są przekierowaniami do portu 22 hop2. W ramach tej sesji oba poniższe są poprawnymi trasami SCP do hop2:
W miejscu pochodzenia:
W ten sposób możesz mieć dowolną liczbę przeskoków pomiędzy nimi, a łatwiej jest pracować pod względem łączenia razem więcej niż dwóch przeskoków.
źródło
Spróbuj dostosować następujący przykład openssh config do konfiguracji, której można użyć na wielu hostach:
Zakłada to zestaw serwerów zaczynających się od „uat-”, które są dostępne tylko za pośrednictwem serwera „bastion-uat” serwera Jumpbox / Gateway. Prawdopodobnie chcesz również dodać,
ForwardAgent yes
jeśli używasz klucza do logowania.źródło
ForwardAgent yes
do tego. Przekazywanie agentów nie jest w tym przypadku konieczne, ponieważ żaden klient ssh nie będzie działał na bastionie, a przekazywanie agenta, gdy nie będzie potrzebne, tylko zmniejszy bezpieczeństwo. I myślę, żessh
brakuje w twoim rozkazie. Jeślissh
używana jest najnowsza wersja, której nie potrzebujesznc
, możeszssh -W %h:%p bastion-uat
zamiast tego wpisać .To nie jest scp (o które poprosił OP), ale uznałem, że bardzo proste
rsync
jest kopiowanie z lokalnego na zdalny za pomocą jednego przeskoku za pomocą:Źródło: http://mjbright.blogspot.com/2012/09/using-rsync-over-multi-hop-ssh.html
Wypróbowałem powyższą sugestię -o ProxyPass i nie chciałem zmieniać konfiguracji dla moich zmieniających się potrzeb. Jak stwierdza autor w powyższym linku, plik docelowy poprzedzający dwukropek (:) jest ważny, aby wskazać określoną ścieżkę na serwerze docelowym. Ponadto, używając rsync, masz opcje porównywania dat, synchronizacji folderów itp. Mam nadzieję, że to komuś pomoże!
źródło
scp -o 'ProxyJump jumpboxname' somefilename.txt finaldestinationhost: / tmp /.
źródło