Mam dostęp do 3 komputerów, A, B i C. Jedyne możliwe połączenia (ssh) to:
A -> B
B <-> C
Muszę pobrać pliki od A do C, aby móc przeskanować pliki od A do B, a następnie przesłać je z B do C. Jednak B nie ma dużo miejsca na dysku, więc nie jest to opcja. Czy istnieje sposób na scp plików z A do C przez B? Uwaga, nie mam dostępu do roota na żadnej maszynie, więc nie sądzę, żebym mógł skonfigurować trwałe tunele, ale poprawcie mnie, jeśli się mylę!
A$ rsync <options> -e 'ssh B ssh' source C:destination
Odpowiedzi:
ProxyJump
Nowości w OpenSSH 7.3:
(Za kulisami używa tylko ProxyCommand i
ssh -W
.)ProxyCommand
Zaktualizowano, aby uwzględnić -W z innych odpowiedzi:
Jeśli A ma zainstalowanego bardzo starego klienta SSH (bez
-W
obsługi) lub jeśli B jest skonfigurowany tak, aby uniemożliwiać przekazywanie TCP (ale nadal pozwala na polecenia powłoki), użyj alternatyw:Rury
Tylko dla jednego pliku:
„Tunel” przez B
Kiedy skończysz, nie zapomnij zabić wcześniej rozpoczętego
ssh
procesu (który spadł do tła z powodu-f -N
).-f
Prosi ssh o przejście do tła tuż przed wykonaniem polecenia. Jest to przydatne, jeśli ssh ma prosić o hasła lub hasła, ale użytkownik chce je w tle. Oznacza to -n.-N
Nie wykonuj polecenia zdalnego. Jest to przydatne tylko w przypadku portów przekierowujących.Odwróć „tunel” przez B do A
Nie zawsze jednak działa:
-R
Określa, że połączenia z danym portem TCP lub gniazdem Unix na zdalnym hoście (serwerze) mają być przekazywane do danego hosta i portu lub gniazda Unix po stronie lokalnej.źródło
scp
z C, choć B, do A, możesz to zrobićA$ scp -oProxyJump=B C:destination thefile
.Wersje scp z początku 2011 roku i później mogą mieć opcję „-3”:
Jeśli tak, możesz po prostu uruchomić:
źródło
Prawie wszystkie zostały już powiedziane, ale oto mój ostatni grosz: używam wariantu ProxyCommand bez
nc
anisoc
. W oparciu o OpenSSH Proxies i Jumphost Cookbook stworzyłem następującą konfigurację:Mamy więc następujących graczy:
Najpierw dodałem mój lokalny klucz publiczny od mojego hosta macierzystego
.ssh/id_dsa.pub
do hostów.ssh/authorized_keys
zarówno hopowych, jak i docelowych. Tak, ten sam klucz publiczny od gospodarza do obu z nich. Zwykle można oczekiwać, że jest to klucz publiczny HOP, który należy dodać do klucza TARGET.Potem
.ssh/config
trochę poprawiłem , dodając następujący wpis:Po tej operacji kopiowania jest tak proste, jak:
scp FILE TARGET_HOST:
. Wyświetla podwójne banery zarówno z węzłów przeskoku, jak i docelowego, ale działa.Oczywiście można użyć wyżej ssh bezpośrednio do celu:
ssh TARGET_HOST
. Działa z scp i ssh.Inną bardziej ogólną opcją może być narzędzie sshuttle , które wydaje się być rodzajem przezroczystego serwera proxy (VPN przez ssh). Zatem w twoim przypadku A-> B <-> C pozwala połączyć się z każdym węzłem w sieci C: A-> B- [CDEFG]. Nie potrzebuje administratora, ale wymaga Python 2.7 (3.5 również OK), co nie zawsze jest tym, co mamy. Warto tego spróbować.
źródło
w innej powłoce:
To używa przekierowania portów. Jedynym ograniczeniem w tym przypadku jest konieczność skonfigurowania hosta B, aby umożliwić przekierowanie portów. W przeciwnym razie powinno to działać poprawnie.
W sposób objaśniający
-L
i-R
umożliwiają przekierowanie portów. W-L
, pierwszym podanym portem jest port, który ssh rozpocznie nasłuchiwanie na maszynie inicjującej (host A), i przekaże wszystko, co otrzyma na tym porcie, za pośrednictwem połączenia SSH do hosta B, a następnie przekieruje do hosta C na porcie 22.edytować
Lekko zepsułem składnię. Ustawia forward na twojej maszynie LOCAL.
źródło
Odpowiedź ProxyCommand firmy Grawity zadziałała dla mnie, ale ponieważ jestem mniej zaznajomiony z SSH, wymagało to pewnych eksperymentów. Myślałem, że po prostu przeliteruję odpowiedź Grawity bardziej szczegółowo, aby pomóc innym początkującym w SSH, takim jak ja. Oto definicje bardziej wyraźnego zapisu:
Maszyna A: maszyna, na której jesteś
Serwer B: [email protected] (host skoku lub serwer pośredni)
Serwer C: [email protected] (serwer zdalny, na który chcesz skopiować)
ProxyCommnad
Konkretny przykład
Przykładowo powiedzmy, że masz dostęp do serwera z adresem IP
0.0.1.2
z kontem użytkownika o nazwiebar
(Serwer C). Ale aby się do niego dostać, musisz najpierw zalogować się do serwera z adresem IP0.0.1.1
przy użyciu konta użytkownika o nazwiefoo
(Serwer B). Teraz chcesz skopiować plikbaz.txt
znajdujący się na danym komputerze (maszynie) do serwera0.0.1.2
„s/home/bar/
katalogu. Aby użyć powyższego ProxyCommand w tym przykładzie, wykonaj następujące czynności:Możesz także równie łatwo skopiować plik z serwera C, zmieniając kolejność pliku i miejsca docelowego. Na przykład, jeśli
baz.txt
był już na serwerze0.0.1.2
zlokalizowanym na,/home/bar/
możesz skopiować go na swój komputer, używając:Mam nadzieję, że to pomaga ludziom, którzy potrzebują czegoś, co zostało im wyjaśnione bardziej niż inni.
źródło