Scp przez proxy za pomocą jednego polecenia z komputera lokalnego?


54

Mam moją local.machine, proxy.machine i target.machine. local.machine nie ma bezpośredniego kontaktu z target.machine, ale musi przejść przez proxy.machine.

Chcę scpować plik z target.machine do local.machine. Czy można to zrobić za pomocą tylko jednego polecenia z local.machine?

Odpowiedzi:


64

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/configpliku 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.


5
Krótka notatka. Jeśli używasz alternatywnego pliku tożsamości za pomocą opcji wiersza polecenia -i dla ssh, musisz określić tę opcję zarówno dla konfiguracji ProxyCommand, jak i wiersza polecenia ssh.
BillMan

7
3 rzeczy, które mogą pomóc, 1) byłoby pomocne, gdybyś pokazał również Host proxy.machinelinie w tym samym ~/.ssh/configpliku, 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 %poznacza
puk

Jak możemy skopiować z komputera lokalnego na komputer docelowy z serwerem proxy?
Mulagala

19

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


Dobra próba, ale gdzie mam dodać nazwę użytkownika dla proxy i do logowania?
grm

Jzst przed nazwami komputerów, z @. Zredagowałem swoją odpowiedź, aby to odzwierciedlić.
Holger Just

19

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

pcredsi tcredsprzedstawiają 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ść ncużywania hosta pośredniego. Za pomocą ssh -W host:portkonfiguruje tunel do określonego hosta i portu i łączy go ze stdin / stdout, a następnie scpbiegnie przez tunel.

%hI %pw ProxyCommandsą 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


1
Sprawdzone, czy to rzeczywiście działa dobrze i nie pozostawia przestarzałych procesów NC leżących na maszynie proxy.
LaXDragon

1
Gdzie mogę określić port serwera proxy?
Marged

1
@Naładowane Obecnie nie jestem w stanie tego tutaj wypróbować, ale myślę, że powinieneś być w stanie uwzględnić -p <portnum>przed -Wktórąkolwiek z metod określania portu proxy
CupawnTae

1
Dopiero po chwili zorientowałem się, że opcja -i (jeśli jej potrzebujesz) wchodzi w cudzysłów. Serwer proxy ssh domyślnie nie używa tego samego klucza prywatnego określonego przez żadną opcję -i dostarczoną bezpośrednio do scp. Myślę, że to oczywiste, kiedy się nad tym zastanowić.
Keeely

18

Jeśli nie masz nic przeciwko użyciu rsync zamiast scp, możesz użyć następującego jednowierszowego:

rsync -v --rsh "ssh proxy.machine ssh" target.machine:/remote/file /local/dir/

(będziesz potrzebować dostępu do maszyny proxy bez hasła)


8
$ ssh -f -N -L <localport>:<target.machine:port> user@proxy.machine
$ scp target-user@local.machine:/remote/file -P <localport> .

OK, właściwie dwa polecenia ...


1
Jak mogę określić port mojego proxy? W moim przypadku8080
Marged

@ Zwiększony dodaj -p <portnumber>do polecenia ssh
weeheavy

6

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.


3

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 -- Xzobacz https://stackoverflow.com/a/23616021/32453


dope bro, zadziałało od razu :)
Elouan Keryell-Even

2

Co powiesz na:

scp -o "ProxyCommand ssh user@myproxyserver.com nc %h %p" your.filename username@yourdestination.yourdomain.com:/whatever_location

lub ewentualnie nazwa użytkownika: hasło tutaj?
rogerdpack,

1

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 -'"

1

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.


0

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

0

Po przeczytaniu tego artykułu znalazłem odpowiedź, która działa dla mnie. (Ponieważ powyższe odpowiedzi nie działają dla mnie).

Jak scpuzyskać 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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.