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?

grm
źródło

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 [email protected] 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.

użytkownik24925
źródło
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 [email protected] nc -w 1 %h 22" [email protected]

[EDYCJA: pomieszana kolejność maszyn ...]

Holger Just
źródło
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 [email protected] -W %h:%p" [email protected]: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 [email protected] -W %h:%p

i odtąd po prostu rób

scp [email protected]:file .

* od wersji OpenSSH 5.4 - wydanej w marcu 2010 r

CupawnTae
źródło
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)

dubek
źródło
8
$ ssh -f -N -L <localport>:<target.machine:port> [email protected]
$ scp [email protected]:/remote/file -P <localport> .

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

weeheavy
źródło
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.

wieloryb
źródło
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

rogerdpack
źródło
dope bro, zadziałało od razu :)
Elouan Keryell-Even
2

Co powiesz na:

scp -o "ProxyCommand ssh [email protected] nc %h %p" your.filename [email protected]:/whatever_location
eggroll77
źródło
lub ewentualnie nazwa użytkownika: hasło tutaj?
rogerdpack,
1

Możesz spróbować czegoś takiego:

ssh [email protected] "ssh [email protected] '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 [email protected] "ssh [email protected] 'tar xvf -'"
Eric Darchis
źródło
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.

Lomai
źródło
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
Lew
źródło
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 [email protected]" \
        archive.gz [email protected]:/home/wise/archive.gz

Mam nadzieję, że ta odpowiedź może ci pomóc.

Wise Lin
źródło