Apakah mungkin menggunakan rsync over sftp (tanpa shell ssh)?

60

Rsync over ssh, berfungsi dengan baik setiap saat.

Namun, mencoba rsync ke host yang memungkinkan hanya login sftp, tetapi bukan login ssh, memberikan kesalahan berikut:

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

versi protokol tidak cocok - apakah shell Anda bersih? (lihat halaman manual rsync untuk penjelasan) kesalahan rsync: ketidakcocokan protokol (kode 2) di compat.c (171) [pengirim = 3.0.6]

Inilah bagian yang relevan dari halaman manual rsync:

Pesan ini biasanya disebabkan oleh skrip startup atau fasilitas shell jarak jauh yang menghasilkan sampah yang tidak diinginkan pada stream yang digunakan rsync untuk pengangkutannya. Cara mendiagnosis masalah ini adalah dengan menjalankan remote shell Anda seperti ini:

          ssh remotehost /bin/true > out.dat

lalu lihat out.dat. Jika semuanya bekerja dengan benar maka out.dat harus berupa file dengan panjang nol. Jika Anda mendapatkan kesalahan di atas dari rsync maka Anda mungkin akan menemukan bahwa out.dat berisi beberapa teks atau data. Lihat isinya dan coba cari tahu apa yang memproduksinya. Penyebab paling umum adalah skrip startup shell yang tidak dikonfigurasi dengan benar (seperti .cshrc atau .profile) yang berisi pernyataan keluaran untuk login non-interaktif.

Mencoba ini di sistem saya menghasilkan yang berikut di out.dat:

ssh-dummy-shell: Perintah tidak diizinkan.

Seperti yang saya pikir, tuan rumah tidak mengizinkan login ssh.

Tautan berikut menunjukkan bahwa mungkin untuk menyelesaikan tugas ini menggunakan sekering dengan sshfs - namun sangat lambat, dan tidak cocok untuk penggunaan produksi.

Apakah ada peluang mendapatkan rsync sftp untuk bekerja?

Tom Feiner
sumber
3
lftp akan melakukan trik. Saya akan menyinkronkan lokal ke jarak jauh dengan saklar -R
Apakah Anda tahu bagaimana perintah dibatasi di server? Jika itu dengan menetapkan ForceCommand di sshd_config, maka lihat apakah Anda dapat memodifikasi file yang menunjuk. Atau jika disetel dengan perintah di otor_keys, maka mungkin Anda dapat mengakses otor_keys melalui sshfs dan mengubahnya?
ptman
Anda dapat mencoba csync : csync /home/csync sftp://[email protected]:2222/home/csyncLihat jawaban ini .
nachtigall
6
Akhirnya, saya melakukannya dengan lftp :lftp -e "mirror -eRv /local/dir/ /remote/dir; quit;" sftp://user@server:port
nachtigall
@nachtigall apakah Anda tahu cara menggunakan lftp dengan beberapa file input / daftar file dan direktori?
bortran

Jawaban:

39

Sayangnya tidak secara langsung. rsyncmembutuhkan tautan bersih dengan shell yang akan memungkinkannya memulai salinan jarak jauh rsync, saat dijalankan dengan cara ini.

Jika Anda memiliki beberapa cara untuk menjalankan proses mendengarkan jangka panjang pada host, Anda dapat mencoba memulai rsync secara manual mendengarkan koneksi pada port non-privilege, tetapi sebagian besar teknik untuk melakukan itu akan memerlukan akses shell yang tepat melalui SSH juga, dan itu bergantung pada firewall host mengatur koneksi di port yang Anda pilih (dan host yang menginstal rsync sejak awal). Menjalankan rsync sebagai layanan yang dapat dialamatkan secara publik (daripada secara tidak langsung melalui SSH atau serupa) umumnya tidak direkomendasikan untuk data non-publik.

Jika host Anda mengizinkan scripting dalam PHP atau yang serupa dan tidak membuatnya terkunci sehingga proses tambahan tidak dapat execdiedit oleh skrip pengguna, maka Anda dapat mencoba memulai rsync dalam mode mendengarkan dengan cara itu. Jika ujung Anda dapat dihubungkan (Anda menjalankan SSH yang dapat diakses oleh dunia luar) Anda dapat mencoba ini secara terbalik - minta skrip menjalankan rsync di server tetapi alih-alih mendengarkan koneksi yang masuk, mintalah hubungi layanan lokal Anda dan sinkronkan dengan cara itu. Ini masih bergantung pada rsync yang sebenarnya sedang diinstal pada host yang tidak diberikan, atau bahwa Anda dapat mengunggah copy pekerjaan, tetapi tidak memiliki implikasi keamanan menjalankan daemon rsync dengan cara yang dapat dialamatkan secara publik dan berbicara dengan rsync secara terbuka dan berbicara dengan rsync secara tidak terenkripsi. saluran.

Berputar-putar seperti dijelaskan di atas mungkin bertentangan dengan kebijakan tuan rumah, meskipun itu berfungsi sama sekali, dan bisa membuat Anda dikeluarkan. Anda lebih baik bertanya apakah shell lengkap dapat diaktifkan untuk akun itu dan meninggalkan rsync untuk host itu atau meninggalkan host itu dan pindah ke tempat lain jika mereka tidak mau melakukannya.

David Spillett
sumber
2
Perhatikan bahwa tidak harus berupa shell penuh; itu hanya harus memungkinkan perintah rsync dengan argumen yang tepat untuk dijalankan. scponly berguna untuk ini.
sciurus
19

Secara teoritis, ya. Anda dapat memasang sistem file jarak jauh pada mesin lokal Anda menggunakan FUSE . Kemudian Anda dapat menjalankan salinan rsync lokal antara direktori yang di-mount dan direktori lokal. Saya belum mencoba ini secara pribadi, tetapi harus bekerja secara teori. Kemungkinan akan jauh lebih efisien daripada melakukan rsync di atas SSH karena itu perlu mentransfer setidaknya sebagian dari setiap file untuk melakukan perbandingan.

Kamil Kisiel
sumber
11
Itu harus bekerja ketika perbandingan cap waktu + ukuran sudah cukup untuk memutuskan apa yang perlu dikirim. Segera setelah checksum diperlukan, seluruh file jarak jauh akan dibaca melalui saluran serta pembaruan yang dikirim, jadi pastikan Anda memiliki opsi rsync yang disetel sehingga semua atau tidak sama sekali untuk setiap file (tidak menggunakan --ignore- kali atau --checksum dan memiliki --whole file yang ditentukan mungkin cukup). Beberapa opsi seperti --link-dest sangat tidak mungkin berfungsi dengan baik (atau sama sekali) dengan cara ini.
David Spillett
Terima kasih telah menambahkan beberapa detail David. Itulah jenis keterbatasan dalam efisiensi yang saya pikirkan, hanya saja tidak mengartikulasikannya dengan baik :)
Kamil Kisiel
Ini adalah solusi dengan keterbatasan, ya, tapi itu cukup baik jika tidak ada cara untuk memanggil rsync yang "tepat"
Valery Lourie
10

Alternatif untuk menggunakan rsync adalah menggunakan lftp (yang dapat terhubung ke sftp) dan menggunakan perintah mirror. Misalnya seseorang dapat melakukannya

lftp
~> open -u user,password sftp://host.com
~> mirror remotedir outdir
~> quit
xioxox
sumber
1
Meskipun posting ini tidak menjawab pertanyaan, ia menyediakan alternatif yang bermanfaat
Dmitri Chubarov
6

sedikit terlambat, tapi di sini adalah bagaimana saya melakukannya, menggunakan 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
sumber
3
Seperti @David Spillett mengatakan dalam komentarnya pada jawaban sebelumnya ( serverfault.com/questions/135618/… ), ini akan berfungsi tetapi sedikit penggunaan protokol rsync yang tidak efisien.
Evan Anderson
2
Jonathan, saya pikir solusi Anda salah. Jika Anda memasang drive jarak jauh dan menjalankan rsync seperti Anda akan menyinkronkan dua folder lokal, selalu ada semua yang ditransfer pada sinkronisasi sejak proses rsync pada mesin lokal Anda menghitung nilai hash dari file jarak jauh. Ini berarti seluruh file ditransfer dan manfaat rsync hilang. Sunting: ah jawaban ini telah diberikan beberapa kali ... coba untuk replikasi: D
Thekwasti
2

Rsync bekerja dengan menjalankan rsync di sisi lain dan berkomunikasi dengannya, yang berarti bahwa beberapa bentuk akses shell diperlukan.

Ignacio Vazquez-Abrams
sumber
2

Alternatifnya adalah memulai rsync sebagai daemon dan terhubung dengannya melalui terowongan SSH.

Dan Andreatta
sumber
Jawaban ini terlalu pendek untuk sepenuhnya membantu, tetapi jika sisi server tidak dapat mengizinkan akses shell tetapi dapat memungkinkan (1) server rsync mendengarkan secara lokal (tidak tersedia dari luar, untuk keamanan), dan (2) ssh tunnel, lalu di prinsipnya seseorang bisa masuk ke server melalui aturan authorized_keysyang memungkinkan terowongan tertentu dan berjalan misalnya sleep 86400. Kemudian sisi klien kemudian bisa rsyncmelalui terowongan.
Stéphane Gourichon
2

Opsi menggabungkan yang terbaik dari semuanya

Tampaknya memiliki kelebihan berikut yang tidak dimiliki jawaban lain di sini:

  • sepenuhnya mendapat manfaat dari SSH (aman)
  • sepenuhnya mendapat manfaat dari rsync (protokol bandwidth-efisien, semua opsi rsync seperti batasan bandwidth)
  • sebenarnya efisien (tidak seperti sshf yang kadang-kadang menyimpan hari tetapi lambat dalam praktiknya)
  • tidak perlu perintah shell sembarang sisi server
  • tidak perlu server untuk mengizinkan terowongan ssh
  • tidak perlu server untuk menjalankan rsyncdaemon

Saya belum mengujinya, tetapi saya telah berhasil menggunakan semua fitur itu kecuali rrsync.

Bagaimana cara melakukannya

  • buat kunci secara lokal dengan ssh-keygen(fitur openSSH)
  • izinkan masuk hanya dengan kunci spesifik itu, dengan entri di server ~/.ssh/authorized_keys(fitur openSSH)
  • kaitkan kunci ini dengan perintah tertentu, dengan ~/.ssh/authorized_keys(fitur openSSH) menggunakan perintah skrip yang rrsyncdidistribusikan dengan rsync, sesuatu seperticommand="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-

Maka Anda dapat rsync dari klien secara normal.

Jika Anda membutuhkan detail lebih lanjut

Membatasi Akses SSH ke rsync | Guy Rutenberg

Satu langkah di luar tautan di atas

Perintah di akhir halaman itu bisa dibuat lebih pendek. Dalam ~/.ssh/configmembuat bait seperti ini:

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

maka perintah rsync Anda dari klien

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

menjadi

rsync -av user@remote: etc2/
Stéphane Gourichon
sumber
1
Sayangnya ini tidak ada hubungannya dengan menggunakan rsync dengan server SFTP, ini adalah tentang mengkonfigurasi server OpenSSH rsyncagar dapat dijalankan, menghindari aspek SFTP. Jika Anda disajikan dengan server SFTP orang lain yang Anda tidak memiliki kendali atas maka jawaban ini tidak dapat menyelesaikan masalah.
Malvineous
Kamu benar. Saya mungkin benar-benar menulis ini untuk menjawab pertanyaan lain dan diposting di sini karena kesalahan. Saya sedang mempertimbangkan untuk menghapus jawaban saya di sini.
Stéphane Gourichon