Jak określić port dla scp dla zdalnego serwera?

Mam dwa zdalne węzły, do których próbuję przesłać pliki z jednego do drugiego.

scp remote1:~/testSCP [email protected]:~/ 

Mam ~/ssh/config skonfigurowany na moim komputerze lokalnym, więc domyślnie używa portu 2222.

Ale domyślny port ssh pilota zdalnego1 jest ustawiony na 22 w konfiguracji ssh zamiast portu 2222. Tak więc, aby połączenie zewnętrzne przez ssh, domyślnie używa portu 22.

Próbowałem następującego rozwiązania, które nie zadziałało:

scp -P 2222 remote1:~/testSCP [email protected]:~/ 

Wypróbowałem również następujące rozwiązanie, które również nie działało:

scp remote1:~/testSCP -P 2222 [email protected]:~/ 

W przypadku obu otrzymałem następujący błąd:

ssh: connect to host 10.0.1.10 port 22: Connection refused lost connection 

Co jest prawdą, ponieważ 10.0.1.10 używa portu 2222, a nie portu 22.

Jak mogę określić remote1, aby używał portu 2222 podczas próby wysłania plików do (remote2) z remote1?

Aktualizuj

Po wypróbowaniu

 scp -3 remote1:~/testSCP [email protected]:~/ 

Zachowuje się dziwnie. Mimo że moje hasło jest poprawne, daje mi następujący wynik:

[email protected]"s password: [email protected]"s password: Permission denied, please try again. [email protected]"s password: Permission denied, please try again. [email protected]"s password: 

Nie włączyłem jeszcze uwierzytelniania bez klucza.

Nowa aktualizacja

Po wypróbowaniu tego na kilka sposobów udało mi się to zrobić w moich skryptach, logując się do remote1 przez ssh z mojego lokalnego hosta, a następnie scp z remote1 do remote2. Jednak to nie odpowiada na moje pytanie. Zamierzałem zrobić to bezpośrednio z lokalnego komputera, a następnie przesłać pliki między dwiema instancjami, co moim zdaniem nie jest obsługiwane, jeśli demony ssh dwóch instancji używają innego portu niż domyślny dla połączenia ssh.

Komentarze

  • stackoverflow.com/questions/10341032/… może ci pomóc
  • Wypróbowałem te, o których wspomniałem w moim pytaniu. Wydaje się, że nie działają dla mnie
  • localhost nasłuchuje na porcie 22, ale w konfiguracji ssh jest określony dla obu remote1 to remote2 do portu 2222. Tak, chodziło mi o ~/.ssh/config W zdalnym 1 i zdalnym domyślny port w ~ / .ssh / config pozostaje niezmieniony, więc jego domyślny port 22. Mogę je edytować, ale chciałbym to zrobić używając jednej linijki, zamiast edytować każdą konfigurację ssh za każdym razem.
  • Ok. Proponuję edytować twoje pytanie, ', dodając, że możesz, ale nie ' nie chcesz tego robić, edytuj plików. Następnie możesz ssh w jeden z hostów zdalnych i wydać proste scp stamtąd lub zrobić to w jednej linii z czymś takim jak ssh -t -p <remote1 port> user1@remote1 'scp -P <remote2 port> user2@remote2:/source/path /dest/path'. Ponadto wygrałeś '. Nie musisz edytować plików config w dowolnym momencie: tylko raz na każdą parę hostów (np. Ustawianie portu dla łączenie się z remote2 na remote1), ale oczywiście może to być niewygodne, w zależności od liczby posiadanych hostów.
  • Tak, to odpowiedź na twoje pytanie. " Nie " jest odpowiedzią i jest odpowiedzią, bez względu na to, czy czy ci się to podoba, czy nie.

Odpowiedz

Nie możesz tego zrobić za pomocą prostego scp zdalnego do zdalnego [1].

Zamiast tego, ssh do pierwszego zdalnego hosta i uruchom scp z argumentem portu stamtąd:

ssh -p 2222 ruser1@rhost1 scp -P 2222 /rpath/1 ruser2@rhost2:/rpath/2 

Jeśli chcesz robić dokładnie to, co robi scp, możesz także dodać opcje -n -x -oClearAllForwardings=yes do ssh, choć zwykle nie jest to potrzebne.


[1]: nowsze wersje scp obsługują specyfikację URI (w tym port) zamiast host:path, ale tylko przy korzystaniu z opcji -3 („pass through the local host”).

Więc prawdopodobnie mógłbyś użyć

scp -3 -P 2222 ruser1@rhost1:/rpath/1 scp://ruser2@rhost2:2222//rpath/2 

(zwróć uwagę, że / po host[:port] nie jest częścią ścieżki – będzie odnosić się do ./file w katalogu domowym user).

Ale kopiowanie przez hosta lokalnego jest zarówno wolniejsze, jak iz mojego doświadczenia wynika, że ukryje błędy. Na przykład nie „nie drukuje żadnego komunikatu o błędzie, mimo że nie można utworzyć żadnego pliku /foo/bar/baz:

scp -3 localhost:.bashrc localhost:/foo/bar/baz 

Nie zagłębiłem się w to w ogóle – po prostu tego uniknąłem 😉


Jeśli ktoś nie jest do tego przekonany, może spojrzeć na kod źródłowy :

void toremote(char *targ, int argc, char **argv) { ... } else if (host) { /* standard remote to remote */ if (tport != -1 && tport != SSH_DEFAULT_PORT) { /* This would require the remote support URIs */ fatal("target port not supported with two " "remote hosts without the -3 option"); } 

Zwróć uwagę, że zmienna tport jest ustawiona tylko analizując scp:// uri i po prostu nie istnieje w wersjach starszych niż 7.6p1 (październik 2017).

Komentarze

  • Czy mógłbyś wyjaśnić, co -x -oClearAllForwardings=yes robi ta opcja w Twojej odpowiedzi? Zastanawiałem się również, czy można to zrobić za pomocą rsync zamiast tego.
  • -x wyłącza przekazywanie X11 i -oClear.. wyłącza wszystkie przekazywanie tcp (na wypadek, gdyby któreś z nich zostało wymuszone przez ~/.ssh/config lub /etc/ssh/ssh_config)
  • @RakibFiha rsync mówi: " Źródło i miejsce docelowe nie mogą być jednocześnie zdalne ". Może są jakieś sztuczki, ale to powinno być osobne pytanie.
  • Teraz zdałem sobie z tego sprawę po Twoim szczegółowym wyjaśnieniu. (y)

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *