Odpowiedzi:
Wiem, że to późna odpowiedź, ale właśnie znalazłem fajny sposób na zrobienie tego. Zasadniczo jest to odpowiedź Holgera Justa, ale w zapisanym pliku konfiguracyjnym:
Musisz umieścić to w swoim ~/.ssh/config
pliku na local.machine, (tworzenie pliku, jeśli nie istnieje)
Host target.machine
User targetuser
HostName target.machine
ProxyCommand ssh proxyuser@proxy.machine nc %h %p 2> /dev/null
Po zapisaniu pliku możesz po prostu użyć
ssh target.machine
za każdym razem, gdy chcesz się połączyć. Scp również będzie działał, ponieważ respektuje również plik konfiguracyjny ssh. Podobnie Nautilus, jeśli korzystasz z GNOME i chcesz korzystać z GUI.
Host proxy.machine
linie w tym samym ~/.ssh/config
pliku, 2) Wspomnij, czy te polecenia mogą być zagnieżdżone (tj. Klient łączy się z hostem proxy 1, który łączy się z hostem proxy 2, z którym się łączy. .. cel) i 3) co nc %h %p
oznacza
Możesz to zrobić za pomocą jednego polecenia, ale na komputerze proxy musi być zainstalowany netcat (nc):
ssh -o "ProxyCommand ssh poxyuser@proxy.machine nc -w 1 %h 22" targetuser@target.machine
[EDYCJA: pomieszana kolejność maszyn ...]
Możesz teraz * zrobić to jako linijkę, nie wymagając nc
nigdzie:
scp -o "ProxyCommand ssh pcreds@proxy.machine -W %h:%p" tcreds@target.machine:file .
Wyjaśnienie
pcreds
i tcreds
przedstawiają swoje poświadczenia proxy i docelowy, jeśli wymagany ( username
, username:password
, itd.).
Jest to możliwe dzięki wbudowanej zdolności podobnej do netcat, co eliminuje konieczność nc
używania hosta pośredniego. Za pomocą ssh -W host:port
konfiguruje tunel do określonego hosta i portu i łączy go ze stdin / stdout, a następnie scp
biegnie przez tunel.
%h
I %p
w ProxyCommand
są zastępowane docelowego hosta i portu można określić.
Dla jeszcze większej wygody możesz skonfigurować proxy w konfiguracji ssh:
Host target.machine
ProxyCommand ssh pcreds@proxy.machine -W %h:%p
i odtąd po prostu rób
scp tcreds@target.machine:file .
* od wersji OpenSSH 5.4 - wydanej w marcu 2010 r
-p <portnum>
przed -W
którąkolwiek z metod określania portu proxy
Jednowarstwowy? Nie z czubka mojej głowy. Najpierw musisz ustanowić proxy i nie możesz tego zrobić z samym SCP.
Robiąc to ręcznie, otwieram sesję ekranu dla mojego tunelu:
screen -S tunnel
Ekran służy do utrzymywania tunelu w powłoce tła. Użyj dowolnej techniki, aby tunel pozostawał otwarty w tle (odpowiedź @ weeheavy jest prawdopodobnie najprostsza). W sesji ekranowej tak zaczynam tunel
ssh -L 2222:target.machine:22 [user@]proxy.machine
Aby rozwiązać ten problem, w zasadzie mówi się: „Na moim komputerze lokalnym otwórz port 2222, a każde połączenie trafiające do hosta lokalnego: 2222 jest przekazywane przez proxy.machine do target.machine: 22”
Po ustanowieniu połączenia ssh i tunelu odłącz się od sesji ekranowej za pomocą „Ca d”. Aby wrócić do tej sesji ekranowej, wpiszscreen -raAd tunnel
Po powrocie do oryginalnej powłoki będzie wyglądało polecenie scp
scp -P 2222 localhost:your/file/on/target.machine local/path
Pamiętaj, że port localhost 2222 to tak naprawdę tunel prowadzący do target.machine.
Wygląda na to, że scp obsługuje opcję „-o”, podobnie jak ssh, chociaż nie jestem pewien, jak przekazać mu nazwę użytkownika / hasło proxy:
scp -o "ProxyCommand=nc -X connect -x proxyhost:proxyport %h %p" remote_user@remote_host:remote_path local_path
Jeśli otrzymasz, nc: invalid option -- X
zobacz https://stackoverflow.com/a/23616021/32453
Co powiesz na:
scp -o "ProxyCommand ssh user@myproxyserver.com nc %h %p" your.filename username@yourdestination.yourdomain.com:/whatever_location
Możesz spróbować czegoś takiego:
ssh user@proxy.machine "ssh user@target.machine 'cat > file'" < file
Ale to nie zadziała, jeśli Twój serwer proxy.machine musi zapytać Cię o hasło (że SSH nie jest w TTY, więc askpass nie powiedzie się).
Jeśli masz więcej niż jeden plik, możesz użyć tar w ten sposób (niesprawdzony, zwykle używam w ten sposób netcata):
tar cf - file1 file2 folder1/ | ssh user@proxy.machine "ssh user@target.machine 'tar xvf -'"
Innym prostym rozwiązaniem przeniesienia plik_zrodlowy z source_host Do destination_host za pośrednictwem proxy_host :
Zaloguj się na serwerze proxy :
ssh login@proxy_host
Z serwera proxy, przenieść plik_zrodlowy z source_host do destination_host (można wpisać to jako jednej linii, pomijając \
lub jako dwie linie, jak pokazano poniżej):
scp login@source_host:/path_to_source_file \
login@destination_host:/path_to_destination_directory
Wymaga to, aby login na hoście_źródłowym do hosta_proxy używa klucza rsa.
Jeśli potrzebujesz użyć kluczy publicznych, potrzebujesz czegoś takiego.
Host target-machine
User target-user
HostName target.example.com
IdentityFile /path/to/file.pem
ProxyCommand ssh bastion -W %h:%p
Host bastion
User bastion-user
HostName bastion.example.com
IdentityFile /path/to/file.pem
Po przeczytaniu tego artykułu znalazłem odpowiedź, która działa dla mnie. (Ponieważ powyższe odpowiedzi nie działają dla mnie).
Jak scp
uzyskać plik za pośrednictwem hosta pośredniego (aka Jump Host)
http://mperdikeas.github.io/networking.html.files/scp-a-file-through-jump-host.html
Moja odpowiedź jest następująca:
scp -oProxyCommand="ssh -W %h:%p {username}@{proxy_IP}" \
{source_file} {remote_username}@{remote_IP}:{remote_file_path}
Przykład:
scp -oProxyCommand="ssh -W %h:%p ubuntu@10.60.10.145" \
archive.gz wise@35.xxx.xxx.xxx:/home/wise/archive.gz
Mam nadzieję, że ta odpowiedź może ci pomóc.