scp między dwoma zdalnymi hostami z mojego (trzeciego) komputera


136

Mam dwa zdalne hosty.
host1-> 10.3.0.1
host2-> 10.3.0.2
Oba działają na serwerze ssh.

Serwer ssh nasłuchuje na porcie 22 na hoście 1 i na porcie 6969 na hoście 2. Teraz, używając mojego komputera lokalnego, muszę skopiować coś z hosta1 na host2 bez logowania się do hosta1 lub host2 przez ssh. Coś jak,

scp user@10.3.0.1:/path/to/file user@10.3.0.2/path/to/file

Jak mogę to zrobić, pamiętaj, że dwa hosty używają różnych portów dla ssh.


Czy pytasz, czy możesz przenieść się z hosta zdalnego do hosta zdalnego, czy pytasz, jak to zrobić bez podawania hasła?
glenn jackman

Podczas gdy -Pistnieje flaga określająca port, który ma być używany, w przypadku transferu zdalnego do zdalnego, ssh jako brak określonego zachowania dotyczącego sposobu określania portu dla jednego hosta ...
mveroone

Odpowiedzi:


216

W przeszłości sposób, w jaki scpdziałał ( naiwnie ) w celu kopiowania plików między zdalnymi systemami, był bardzo niewygodny: na przykład pisałeś

    scp user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt

scpnajpierw otworzy sshsesję na scpzdalnym 1 , a następnie uruchomi się stamtąd na zdalnym 2. Aby to zadziałało, musisz skonfigurować poświadczenia autoryzacji dla remote2 na remote1.

Zamiast tego nowoczesny sposób („nowoczesny”, ponieważ został zaimplementowany zaledwie kilka lat temu i być może nie wszyscy są w stanie to -3zrobić scp) wymaga dwóch kroków. Pierwszym niezbędnym krokiem jest ~/.ssh/configskonfigurowanie wszystkich opcji połączenia zarówno ze zdalnym 1, jak i zdalnym 2 w następujący sposób:

    Host remote1.example.org
    Port 2222
    IdentityFile /path/to/host1-id_rsa

    Host remote2.example.org
    Port 6969
    IdentityFile /path/to/host2-id_rsa

W ten sposób staje się możliwe przekazywanie wszystkich niezbędnych opcji do polecenia bez dwuznaczności : na przykład, jeśli powiedzieliśmy w interfejsie CLI, że korzystamy z portu 2222 bez powyższej konfiguracji, nie byłoby jasne, czy mówimy o zdalnym1, czy zdalnym2 , i podobnie dla pliku zawierającego klucze kryptograficzne. W ten sposób CLI pozostaje uporządkowany i prosty.

Po drugie, użyj -3opcji w następujący sposób:

    scp -3 user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt

Ta -3opcja nakazuje scpkierowanie ruchu przez komputer, na którym wydano polecenie, nawet jeśli jest to strona trzecia transferu. W ten sposób poświadczenia autoryzacji muszą znajdować się tylko na komputerze wydającym, stronie trzeciej.


6
Do wykorzystania w przyszłości: Jeśli skopiujesz plik między dwoma hostami, które współużytkują plik tożsamości (np. Instancję EC2), nie potrzebujesz pliku konfiguracyjnego. Jeden argument -i jest wystarczający do połączenia z dwoma hostami.
Artur Czajka

1
Warto również zauważyć, że dla Google Compute Engine istnieje możliwość dodawania do ~/.ssh/configpliku: cloud.google.com/compute/docs/gcloud-compute, ale nie sądzę, że AWS ma takie samo wsparcie
modulitos

1
Ponieważ nie zobaczysz danych wyjściowych tak jak zwykle, wskazówką jest włączenie trybu pełnego przy pomocy -v.
holmberd

6

Ostatnim razem, gdy tego próbowałem, scp nie był w stanie tego zrobić. Twój wiersz poleceń wygląda dobrze. To obejście będzie działać:

ssh -p port_on_machine1 user@machine1 "cat /path/to/file/one"|ssh -p port_on_machine2 user@machine2 "cat >/path/to/file/two"

moja strona podręcznika scp mówi: „Dozwolone są również kopie między dwoma zdalnymi hostami”.
glenn jackman

1
Dzięki, dobrze to słyszeć. Aby scp można podać flagę -P (została napisana przez niektóre osoby z BSD, ponieważ jej obsługa argumentów jest tak tragiczna :-(), ale wygląda na to, że nie można określić różnych portów na zdalnych hostach. Przepraszam, ale myślę, że tylko to obejście jest lewe (lub istnieje wiele trudniejszych rozwiązań, używając ssh, ale unikając scp - na przykład sftpfs, ale nie są one najprostsze). Rozszerzyłem moje obejście z ustawieniami portów.
user259412

4

W moim przypadku robiłem kopię zdalną do zdalnej, bez -3argumentu. Port podany z parametrem „-P” działa z pierwszym serwerem, ale port 22 jest używany z drugim serwerem.

ssh -P 1234 user@server1.mydomain.com user@server2.otherdomain.com

Rozwiązaniem jest edycja /etc/ssh/ssh_configpliku server1i dodanie następujących wierszy:

Host *.otherdomain.com
   Port  1234

W ten sposób port 1234 jest używany dla obu z nich. Może być inaczej.

To rozwiązanie ma lepszą przepustowość niż poprzednie rozwiązania, ponieważ komunikowanie jest bezpośrednie.


perez czy istnieje sposób na uzyskanie scp przez dwa różne porty dla dwóch różnych zdalnych maszyn z linii komand?
Czerwona butelka

4

Źródło i cel można określić jako identyfikator URI w postaci scp: // [użytkownik @] host [: port] [/ ścieżka]

abyś mógł uruchomić:

scp -3 scp://user@10.3.0.1:22/path/to/file scp://user@10.3.0.2:6969/path/to/file
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.