Czy możliwe jest określenie innego portu ssh podczas korzystania z rsync?

366

Próbowałem wykonać następujące polecenie:

rsync -rvz --progress --remove-sent-files ./dir user@host:2222/path

SSH działa na porcie 2222, ale rsync nadal próbuje użyć portu 22, a następnie narzeka na brak znalezienia ścieżki, ponieważ oczywiście nie istnieje.

Chciałbym wiedzieć, czy możliwe jest rsync na zdalnym hoście na niestandardowym porcie ssh.

Ketema
źródło

Odpowiedzi:

136

Inną opcją, na hoście, z którego uruchamiasz rsync, ustaw port w pliku konfiguracyjnym ssh, tj .:

cat ~/.ssh/config
Host host
    Port 2222

Następnie rsync przez ssh będzie rozmawiać z portem 2222:

rsync -rvz --progress --remove-sent-files ./dir user@host:/path
Joao Costa
źródło
21
Chociaż nie jest to najbardziej oczywista odpowiedź, nadal jest to bardzo dobra odpowiedź. Warto użyć konfiguracji SSH dla każdego hosta, z którym łączysz się więcej niż raz lub dwa, ponieważ pozwoli ci to zaoszczędzić wiele czasu na pisaniu i myśleniu.
John Hunt
5
Rzeczywiście, chociaż uczciwie, wadą jest to, że staje się niewidoczna, tzn. Po pewnym czasie można zapomnieć o tym, że znajduje się w pliku konfiguracyjnym ssh i nie zrozumieć, jak to działa, lub jeden z twoich kolegów może skopiować / wkleić polecenie i nie zrozumieć, dlaczego to nie działa na ich koncie. Mimo to osobiście wolę nie wpisywać numeru portu przez cały czas.
Joao Costa
1
To jest okropne. jest całkowicie niekompatybilny z NATem portu. chyba że chcesz mieć wiele nazw dns dla tego samego adresu IP, co stanowi problem z konserwacją
meffect
1
@melfect Żartujesz? Nie nazwałbym tego tak strasznym, jak nazwałbym to najlepszą rzeczą dla kogoś, kto musi rsyncwielokrotnie wchodzić do dziwnego portu, ale za każdym razem rozkłada się na tyle, by zapomnieć o składni.
Freedom_Ben
1
Ułatwia to łączenie się, ale także hakerów, a dziennik auth.log ponownie zostanie zalany automatycznymi próbami. Więc to w pewnym sensie unieważnia sens zmiany portów.
forwardrin
625

Twój wiersz poleceń powinien wyglądać następująco:

rsync -rvz -e 'ssh -p 2222' --progress ./dir user@host:/path

to działa dobrze - używam go cały czas bez potrzeby stosowania nowych reguł zapory - pamiętaj tylko, że samo polecenie SSH jest ujęte w cudzysłów.

klapa
źródło
8
Zastanawiam się, dlaczego tak jest - jest to tak oczywista potrzeba, wciąż dość ukryta, ponieważ skutecznie tworzy alias do pliku binarnego ssh. (
Działało
1
Współpracuje z symbolem dwukropkauser@host:/path
Dmitrij Sandałow
23
kluczową częścią polecenia jest -e 'ssh -p 2222', dzięki czemu można go używać z różnymi parametrami rsync
Evan Donovan
2
Zauważ, że jeśli potrzebujesz podać klucz ssh, możesz to zrobić, np. -E 'ssh -i mykey -p 2222'
dranxo
9
dlaczego --remove-sent-files? Jeśli jest to niebezpieczne dla danych źródłowych, lepiej wspomnij o tym ...
Tiw
14

gdy musisz wysłać pliki przez określony port SSH:

rsync -azP -e "ssh -p PORT_NUMBER" source destination

przykład

rsync -azP -e "ssh -p 2121" /path/to/files/source user@remoteip:/path/to/files/destination
Techie
źródło
3
i co dokładnie to dodaje do istniejącej odpowiedzi?
Chris Maes,
spójrz na format i przykład. Upraszczam tutaj rzeczy.
Techie
4
OK, usunąłeś dwie opcjonalne opcje, ale w zasadzie twoja odpowiedź jest dokładnie taka sama jak zaakceptowana ...
Chris Maes
2
Jest bardziej uproszczony i sformatowany. Łatwiejsze do zrozumienia dla nowych uczniów. Nawiasem mówiąc, dzięki za głosowanie w dół bez podania przyczyny
Techie
2

Trochę nie na temat, ale może komuś pomóc. Jeśli musisz podać hasło i port, sugeruję użycie sshpasspakietu. Komenda wiersza poleceń wyglądałaby następująco: sshpass -p "password" rsync -avzh -e 'ssh -p PORT312' [email protected]:/dir_on_host/

Tomas
źródło
To nie działa, ponieważ interaktywne klawisze komunikują się ze strumieniem danych, powodując uszkodzenie protokołu.
Evi1M4chine
2

Znalazłem to rozwiązanie na stronie Mike Hike Hostetler, które działało idealnie dla mnie.

# rsync -avz -e "ssh -p $portNumber" user@remoteip:/path/to/files/ /local/path/
Zardzewiały 1
źródło
3
i co dokładnie to dodaje do istniejącej odpowiedzi?
Chris Maes,
Fajny działa idealnie. Dzięki :)
Sammu Sundar
2

Prawidłowa składnia polega na poleceniu Rsync użycia niestandardowej komendy SSH (dodanie -p 2222), która tworzy bezpieczny tunel do strony zdalnej za pomocą SSH, a następnie łączy się przez localhost: 873

rsync -rvz --progress --remove-sent-files -e "ssh -p 2222" ./dir użytkownik @ host / ścieżka

Rsync działa jako demon na porcie TCP 873, który nie jest bezpieczny.

Od człowieka Rsync:

Wciśnij: rsync [OPCJA ...] SRC ... [USER @] HOST: DEST

Które wprowadzają ludzi w błąd, aby spróbować:

rsync -rvz --progress --remove-sent-files ./dir użytkownik @ host: 2222 / ścieżka

To jednak instruuje go, aby łączył się z demonem Rsync na porcie 2222, którego tam nie ma.

kevinf
źródło
inne odpowiedzi nie wspominały o porcie 873
kevinf
pytanie brzmiało, jak uruchomić go jako ssh przez port 2222; czy rsync wymaga, to inna historia.
Dan Steingart,
@ DanSteingart Zaktualizowałem odpowiedź, czy to pomaga bardziej teraz?
kevinf
-3

Nie mogłem zmusić rsync do połączenia przez ssh na innym porcie, ale mogłem przekierować połączenie ssh do komputera, który chciałem przez iptables. Nie takiego rozwiązania szukałem, ale rozwiązało to mój problem.

Ketema
źródło