Czy można używać rsync przez sftp (bez powłoki ssh)?

60

Rsync przez ssh, działa świetnie za każdym razem.

Jednak próba rsynchronizacji z hostem, który zezwala tylko na logowanie sftp, ale nie na logowanie ssh, powoduje następujący błąd:

rsync -av / source ssh user @ remotehost: / target /

niezgodność wersji protokołu - czy twoja powłoka jest czysta? (wyjaśnienie znajduje się na stronie podręcznika użytkownika rsync) błąd rsync: niezgodność protokołu (kod 2) w kompatybil.c (171) [sender = 3.0.6]

Oto odpowiednia sekcja ze strony man rsync:

Ten komunikat jest zwykle spowodowany przez skrypty startowe lub narzędzie zdalnej powłoki produkujące niechciane śmieci w strumieniu używanym przez rsync do transportu. Aby zdiagnozować ten problem, uruchom zdalną powłokę w następujący sposób:

          ssh remotehost /bin/true > out.dat

następnie spójrz na out.dat. Jeśli wszystko działa poprawnie, plik out.dat powinien być plikiem o zerowej długości. Jeśli otrzymujesz powyższy błąd z rsync, prawdopodobnie przekonasz się, że plik out.dat zawiera tekst lub dane. Spójrz na zawartość i spróbuj ustalić, co ją produkuje. Najczęstszą przyczyną są niepoprawnie skonfigurowane skrypty startowe powłoki (takie jak .cshrc lub .profile), które zawierają instrukcje wyjściowe dla nieinteraktywnych loginów.

Wypróbowanie tego w moim systemie spowodowało, że w out.dat:

ssh-dummy-shell: Polecenie niedozwolone.

Tak jak myślałem, host nie pozwala na logowanie ssh.

Poniższy link pokazuje, że możliwe jest wykonanie tego zadania za pomocą bezpiecznika z sshfs - jednak jest on bardzo wolny i nie nadaje się do użytku produkcyjnego.

Czy jest jakaś szansa na uruchomienie rsync sftp?

Tom Feiner
źródło
3
lftp załatwi sprawę. Zsynchronizuję lokalnie ze zdalnym za pomocą przełącznika -R
Czy wiesz, w jaki sposób polecenia są ograniczone na serwerze? Jeśli tak jest, ustawiając ForceCommand w sshd_config, sprawdź, czy możesz zmodyfikować plik, który wskazuje. A jeśli jest ustawiony poleceniem w uprawnionych kluczach, to może możesz uzyskać dostęp do kluczy autoryzowanych przez sshfs i to zmienić?
ptman
Możesz spróbować csync : csync /home/csync sftp://[email protected]:2222/home/csynczobacz tę odpowiedź .
nachtigall
6
Ostatecznie zrobiłem to z lftp :lftp -e "mirror -eRv /local/dir/ /remote/dir; quit;" sftp://user@server:port
nachtigall
@nachtigall czy wiesz, jak używać lftp z wieloma plikami wejściowymi / listą plików i katalogów?
bortran

Odpowiedzi:

39

Niestety nie bezpośrednio. rsyncwymaga czystego linku z powłoką, który pozwoli mu uruchomić zdalną kopię rsyncpo uruchomieniu w ten sposób.

Jeśli masz jakiś sposób uruchamiania długotrwałych procesów nasłuchiwania na hoście, możesz spróbować uruchomić rsync ręcznie nasłuchując połączeń na nieuprzywilejowanym porcie, ale większość technik, które to robią, wymagałaby również odpowiedniego dostępu do powłoki przez SSH, i to zależy od konfiguracja zapory hosta zezwalająca na połączenia na wybranym porcie (i host z zainstalowanym rsync w pierwszej kolejności). Uruchamianie rsync jako usługi publicznie dostępnej (zamiast pośrednio przez SSH lub podobny) nie jest jednak ogólnie zalecane w przypadku danych niepublicznych.

Jeśli host pozwala na tworzenie skryptów w PHP lub podobnym i nie ma go zablokowanego, więc dodatkowe procesy nie mogą być execedytowane przez skrypty użytkownika, możesz spróbować uruchomić rsync w trybie nasłuchiwania w ten sposób. Jeśli twój koniec jest możliwy do podłączenia (korzystasz z SSH dostępnego dla świata zewnętrznego), możesz spróbować w odwrotnej kolejności - uruchom skrypt rsync na serwerze, ale zamiast nasłuchiwać połączeń przychodzących, skontaktuj się z lokalną usługą i zsynchronizuj w ten sposób. Nadal zależy to od faktycznego zainstalowania rsync na hoście, co nie jest dane, lub że można przesłać kopię roboczą, ale nie ma to wpływu na bezpieczeństwo uruchamiania demona rsync w sposób publicznie adresowalny i rozmawiania z nim za pomocą niezaszyfrowanego kanał.

Zaniepokojenie, jak opisano powyżej, może być jednak sprzeczne z zasadami hosta, nawet jeśli w ogóle działa i może cię wyrzucić. Lepiej jest zapytać, czy dla tego konta można włączyć pełną powłokę, albo porzucić rsync dla tego hosta, albo porzucić ten host i przenieść się gdzie indziej, jeśli tego nie zrobią.

David Spillett
źródło
2
Zauważ, że nie musi to być pełna powłoka; musi po prostu pozwolić na uruchomienie komendy rsync z odpowiednimi argumentami. scponly jest do tego przydatny.
sciurus
19

Teoretycznie tak. Możesz zamontować zdalny system plików na komputerze lokalnym za pomocą FUSE . Następnie możesz uruchomić lokalną kopię rsync między katalogiem podłączonym a katalogiem lokalnym. Nie próbowałem tego osobiście, ale powinno to działać w teorii. Prawdopodobnie byłoby o wiele mniej wydajne niż wykonywanie rsync przez SSH, ponieważ musiałoby przesłać co najmniej część każdego pliku, aby wykonać porównanie.

Kamil Kisiel
źródło
11
Powinno to zadziałać, gdy porównanie znacznika czasu i rozmiaru wystarczy, aby zdecydować, co należy wysłać. Gdy tylko potrzebna będzie suma kontrolna, cały plik zdalny zostanie odczytany przez linię, a także wysłane aktualizacje, więc upewnij się, że masz ustawione opcje rsync tak, że robi on wszystko albo nic dla każdego pliku (nie używając --ignore- razy lub --checksum i posiadanie --whole-file może wystarczyć). Niektóre opcje, takie jak --link-dest, prawdopodobnie nie będą działać poprawnie (lub wcale) w ten sposób.
David Spillett
Dzięki za dodanie szczegółów David. Właśnie takie ograniczenia wydajności miałem na myśli, po prostu nie wyartykułowałem ich zbyt dobrze :)
Kamil Kisiel
Jest to obejście z ograniczeniami, tak, ale jest wystarczająco dobre, jeśli nie ma sposobu na wywołanie „właściwego” rsync
Valery Lourie
10

Alternatywą dla korzystania z rsync jest użycie lftp (które może połączyć się z sftp) i użycie polecenia mirror. Na przykład można to zrobić

lftp
~> open -u user,password sftp://host.com
~> mirror remotedir outdir
~> quit
xioxox
źródło
1
Chociaż ten post nie odpowiada na pytanie, stanowi przydatną alternatywę
Dmitrij Chubarow
5

trochę późno, ale oto jak to zrobić, używając sshfs

  source /scratch/slimdata/password.sh
  mkdir tmp_mnt
  echo $PASSWORD | sshfs user@host:dir tmp_mnt -o password_stdin
  rsync -rutL --delete tmp_mnt/ to_sync/
  fusermount -u tmp_mnt
  rmdir tmp_mnt
jonathan
źródło
3
Jak powiedział @David Spillett w swoim komentarzu do wcześniejszej odpowiedzi ( serverfault.com/questions/135618 / ... ), to zadziała, ale jest to trochę nieefektywne użycie protokołu rsync.
Evan Anderson
2
jonathan, myślę, że twoje rozwiązanie jest złe. Jeśli zamontujesz dysk zdalny i uruchomisz rsync tak, jakbyś zsynchronizował dwa foldery lokalne, zawsze wszystko jest synchronizowane, ponieważ proces rsync na komputerze lokalnym oblicza wartości skrótu plików zdalnych. Oznacza to, że cały plik jest przenoszony, a zalety rsync są tracone. Edycja: ah ta odpowiedź została podana kilka razy ... proszę o replikację: D
Thekwasti
2

Nie. Rsync działa, uruchamiając rsync po drugiej stronie i komunikując się z nim, co oznacza, że ​​wymagany jest pewien rodzaj dostępu do powłoki.

Ignacio Vazquez-Abrams
źródło
2

Alternatywą byłoby uruchomienie rsync jako demona i połączenie się z nim przez tunel SSH.

Dan Andreatta
źródło
Ta odpowiedź jest zbyt krótka, aby była całkowicie pomocna, ale jeśli po stronie serwera nie można zezwolić na dostęp do powłoki, ale można zezwolić (1) serwerowi rsync nasłuchując lokalnie (niedostępne z zewnątrz dla bezpieczeństwa) i (2) tunelowi ssh, a następnie w zasada, że ​​można zalogować się do serwera za pomocą reguły, authorized_keysktóra zezwala na określony tunel i działa np sleep 86400. Następnie strona klienta może następnie rsyncprzejść przez tunel.
Stéphane Gourichon
2

Opcja łączenia najlepiej ze wszystkich

Wydaje się, że ma następujące zalety, których inne odpowiedzi tutaj nie mają:

  • w pełni korzysta z SSH (bezpieczny)
  • w pełni korzysta z rsync (protokół efektywny dla przepustowości, wszystkie opcje rsync, takie jak ograniczenie przepustowości)
  • faktycznie wydajne (w przeciwieństwie do sshfs, które czasami oszczędzają dni, ale w praktyce wciąż są wolne)
  • nie potrzebuje dowolnych poleceń powłoki po stronie serwera
  • nie potrzebuje serwera, aby zezwolić na tunele ssh
  • nie potrzebuje serwera do uruchomienia rsyncdemona

Jeszcze go nie testowałem, ale z powodzeniem korzystałem z wszystkich tych funkcji oprócz rrsync.

Jak to zrobić

  • utwórz klucz lokalnie za pomocą ssh-keygen(funkcja openSSH)
  • zezwól na logowanie tylko przy użyciu tego określonego klucza, z wpisem na serwerze ~/.ssh/authorized_keys(funkcja openSSH)
  • powiąż ten klucz z konkretnym poleceniem, używając ~/.ssh/authorized_keys(funkcja openSSH) używając jako polecenia skryptu rrsyncdystrybuowanego z rsync, coś w rodzajucommand="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-

Następnie możesz normalnie synchronizować rsync z klientem.

Jeśli potrzebujesz więcej szczegółów

Ograniczanie dostępu SSH do rsync | Guy Rutenberg

Jeden krok poza linkiem powyżej

Polecenie na końcu tej strony można skrócić. Aby ~/.ssh/configutworzyć sekcję taką jak ta:

Host remote # can be host or ip or custom-label User user # login on remote host HostName optional-dns-resolvable-host-or-ip # if label used above IdentityFile ~/.ssh/id_remote_backup

następnie polecenie rsync z klienta

rsync -e "ssh -i $HOME/.ssh/id_remote_backup" -av user@remote: etc2/

staje się

rsync -av user@remote: etc2/
Stéphane Gourichon
źródło
1
Niestety nie ma to nic wspólnego z używaniem rsync z serwerem SFTP, chodzi o skonfigurowanie serwera OpenSSH tak, aby umożliwiał rsyncuruchomienie, pomijając aspekt SFTP. Jeśli zostanie Ci przedstawiony serwer SFTP innej osoby, nad którym nie masz kontroli, ta odpowiedź nie rozwiąże problemu.
Malvineous
Masz rację. Mógłbym to napisać, żeby odpowiedzieć na inne pytanie, i zamieściłem tutaj przez pomyłkę. Rozważam usunięcie tutaj mojej odpowiedzi.
Stéphane Gourichon