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
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)
~/.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.ssh
w jeden z hostów zdalnych i wydać prostescp
stamtąd lub zrobić to w jednej linii z czymś takim jakssh -t -p <remote1 port> user1@remote1 'scp -P <remote2 port> user2@remote2:/source/path /dest/path'
. Ponadto wygrałeś '. Nie musisz edytować plikówconfig
w dowolnym momencie: tylko raz na każdą parę hostów (np. Ustawianie portu dla łączenie się zremote2
naremote1
), ale oczywiście może to być niewygodne, w zależności od liczby posiadanych hostów.