Có thể sử dụng rsync trên sftp (không có vỏ ssh) không?


60

Rsync trên ssh, hoạt động tuyệt vời mọi lúc.

Tuy nhiên, cố gắng rsync đến một máy chủ chỉ cho phép đăng nhập sftp, nhưng không đăng nhập ssh, cung cấp lỗi sau:

người dùng rsync -av / nguồn ssh @ remotehost: / target /

phiên bản giao thức không khớp - vỏ của bạn có sạch không? (xem trang man rsync để biết giải thích) lỗi rsync: không tương thích giao thức (mã 2) tại compat.c (171) [sender = 3.0.6]

Đây là phần có liên quan từ trang man rsync:

Thông báo này thường được gây ra bởi các tập lệnh khởi động hoặc cơ sở shell từ xa tạo ra rác không mong muốn trên luồng mà rsync đang sử dụng để vận chuyển. Cách để chẩn đoán vấn đề này là chạy shell từ xa của bạn như thế này:

          ssh remotehost /bin/true > out.dat

sau đó nhìn ra ngoài. Nếu mọi thứ đều hoạt động chính xác thì out.dat phải là một tệp có độ dài bằng không. Nếu bạn nhận được lỗi trên từ rsync thì có thể bạn sẽ thấy rằng out.dat chứa một số văn bản hoặc dữ liệu. Nhìn vào nội dung và cố gắng tìm ra những gì đang sản xuất nó. Nguyên nhân phổ biến nhất là các tập lệnh khởi động shell được cấu hình không chính xác (như .cshrc hoặc .profile) có chứa các câu lệnh đầu ra cho thông tin đăng nhập không tương tác.

Thử điều này trên hệ thống của tôi đã tạo ra các mục sau trong out.dat:

ssh-dummy-shell: Lệnh không được phép.

Theo tôi nghĩ, máy chủ không cho phép đăng nhập ssh.

Liên kết sau đây cho thấy có thể hoàn thành nhiệm vụ này bằng cách sử dụng cầu chì với sshfs - tuy nhiên nó rất chậm và không phù hợp cho sử dụng sản xuất.

Có bất kỳ cơ hội nào để rsync sftp hoạt động không?


3
lftp sẽ làm các thủ thuật. Tôi sẽ đồng bộ hóa cục bộ với điều khiển từ xa bằng công tắc -R

Bạn có biết làm thế nào các lệnh bị hạn chế trên máy chủ? Nếu đó là bằng cách đặt ForceCommand trong sshd_config, hãy xem liệu bạn có thể sửa đổi tệp trỏ đến không. Hoặc nếu nó được đặt bằng lệnh trong ủy quyền_key, thì có lẽ bạn có thể truy cập Author_keys qua sshfs và thay đổi nó?
ptman

Bạn có thể thử csync : csync /home/csync sftp://csync@krikkit.galaxy.site:2222/home/csyncXem câu trả lời này .
nachtigall

6
Cuối cùng, tôi đã làm điều đó với lftp :lftp -e "mirror -eRv /local/dir/ /remote/dir; quit;" sftp://user@server:port
nachtigall

@nachtigall bạn có biết cách sử dụng lftp với nhiều tệp đầu vào / danh sách các tệp và thư mục không?
bortran

Câu trả lời:


39

Đáng tiếc là không trực tiếp. rsyncyêu cầu một liên kết sạch với một vỏ sẽ cho phép nó bắt đầu sao chép từ xa rsync, khi chạy theo cách này.

Nếu bạn có một số cách để chạy các quy trình nghe lâu dài trên máy chủ, bạn có thể thử bắt đầu rsync nghe thủ công các kết nối trên một cổng không có đặc quyền, nhưng hầu hết các kỹ thuật để thực hiện điều đó cũng yêu cầu truy cập shell thích hợp thông qua SSH và nó cũng phụ thuộc vào các sắp xếp tường lửa máy chủ cho phép kết nối trên cổng bạn chọn (và máy chủ có cài đặt rsync ở vị trí đầu tiên). Chạy rsync như một dịch vụ có địa chỉ công khai (thay vì gián tiếp qua SSH hoặc tương tự) thường không được khuyến nghị cho dữ liệu ngoài công khai.

Nếu máy chủ của bạn cho phép tập lệnh trong PHP hoặc tương tự và không bị khóa, do đó các quy trình bổ sung không thể được chỉnh sửa execbởi tập lệnh người dùng, thì bạn có thể thử bắt đầu rsync ở chế độ nghe theo cách đó. Nếu kết thúc của bạn có thể kết nối (bạn đang chạy SSH có thể truy cập được với thế giới bên ngoài), bạn có thể thử điều này ngược lại - có tập lệnh chạy rsync trên máy chủ nhưng thay vì nghe các kết nối đến, hãy liên hệ với dịch vụ cục bộ của bạn và đồng bộ hóa theo cách đó. Điều này vẫn phụ thuộc vào rsync thực sự được cài đặt trên máy chủ không được cung cấp hoặc bạn có thể tải lên một bản sao đang hoạt động, nhưng không có ý nghĩa bảo mật khi chạy một daemon rsync theo kiểu địa chỉ công khai và nói chuyện với nó qua một địa chỉ không được mã hóa kênh.

Mặc dù xung quanh như được mô tả ở trên có thể chống lại các chính sách của máy chủ, ngay cả khi nó hoạt động hoàn toàn, và có thể khiến bạn bị đá. Bạn nên hỏi xem liệu toàn bộ vỏ có thể được kích hoạt cho tài khoản đó hay không và từ bỏ rsync cho máy chủ đó hoặc từ bỏ máy chủ đó và chuyển đi nơi khác nếu họ không làm điều đó.


2
Lưu ý rằng nó không phải là một vỏ đầy đủ; nó chỉ phải cho phép lệnh rsync với các đối số thích hợp để chạy. scponly là hữu ích cho việc này.
tọa

19

Về mặt lý thuyết, có. Bạn có thể gắn hệ thống tập tin từ xa vào máy cục bộ của mình bằng FUSE . Sau đó, bạn có thể chạy một bản sao rsync cục bộ giữa thư mục được gắn và thư mục cục bộ. Cá nhân tôi đã không thử điều này, nhưng nó sẽ hoạt động trên lý thuyết. Việc thực hiện rsync trên SSH có thể sẽ kém hiệu quả hơn rất nhiều vì nó sẽ cần phải chuyển ít nhất một phần của mỗi tệp để thực hiện so sánh.


11
Điều đó sẽ hoạt động khi dấu thời gian + so sánh kích thước là đủ để quyết định những gì cần gửi. Ngay sau khi cần kiểm tra, toàn bộ tệp từ xa sẽ được đọc qua dòng cũng như các bản cập nhật được gửi, vì vậy hãy đảm bảo bạn có các tùy chọn của rsync được đặt sao cho tất cả hoặc không có gì cho mỗi tệp (không sử dụng --ignore- lần hoặc --checksum và có --whole-file được chỉ định có thể là đủ). Một số tùy chọn như --link-Dest rất khó có thể hoạt động đúng (hoặc hoàn toàn) theo cách này.
David Spillett

Cảm ơn đã thêm một số chi tiết David. Đó là loại hạn chế về hiệu quả mà tôi đã nghĩ đến, chỉ là không nói rõ chúng thôi :)
Kamil Kisiel

Đó là một cách giải quyết với những hạn chế, vâng, nhưng nó đủ tốt nếu không có cách nào để gọi rsync "đúng"
Valery Lourie

10

Một cách khác để sử dụng rsync là thay vào đó sử dụng lftp (có thể kết nối với sftp) và sử dụng lệnh mirror. Ví dụ người ta có thể làm

lftp
~> open -u user,password sftp://host.com
~> mirror remotedir outdir
~> quit

1
Trong khi bài đăng này không trả lời câu hỏi, nó cung cấp một sự thay thế hữu ích
Dmitri Chubarov

5

hơi muộn, nhưng đây là cách tôi làm, sử dụng 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

3
Như @David Spillett đã nói trong nhận xét của mình về câu trả lời trước đó ( serverfault.com/questions/135618/ mẹo ), điều này sẽ hoạt động nhưng sử dụng giao thức rsync không hiệu quả.
Evan Anderson

2
jonathan, tôi nghĩ rằng giải pháp của bạn là sai. Nếu bạn gắn ổ đĩa từ xa và thực thi rsync như bạn sẽ đồng bộ hóa hai thư mục cục bộ, sẽ luôn có mọi thứ được đồng bộ hóa do quá trình rsync trên máy cục bộ của bạn tính toán giá trị băm của các tệp từ xa. Điều này có nghĩa là toàn bộ tệp được chuyển và lợi ích của rsync bị mất. Chỉnh sửa: ah câu trả lời này đã được đưa ra nhiều lần ... xin lỗi để nhân rộng: D
Thekwasti 22/03/2016

2

Rsync hoạt động bằng cách chạy rsync ở phía bên kia và liên lạc với nó, điều đó có nghĩa là một số hình thức truy cập shell là bắt buộc.


2

Một cách khác là bắt đầu rsync dưới dạng daemon và kết nối với nó thông qua một đường hầm SSH.


Câu trả lời này quá ngắn để hoàn toàn hữu ích, nhưng nếu phía máy chủ không thể cho phép truy cập shell nhưng có thể cho phép (1) máy chủ rsync nghe cục bộ (không có sẵn từ bên ngoài, để bảo mật) và (2) đường hầm ssh, thì trong nguyên tắc người ta có thể đăng nhập vào máy chủ thông qua một quy tắc authorized_keyscho phép một đường hầm cụ thể và chạy, ví dụ sleep 86400. Sau đó phía khách hàng có thể rsyncthông qua đường hầm.
Stéphane Gourichon

2

Tùy chọn kết hợp tốt nhất của tất cả

Dường như có những ưu điểm sau mà các câu trả lời khác ở đây không có:

  • lợi ích đầy đủ từ SSH (an toàn)
  • lợi ích đầy đủ từ rsync (giao thức hiệu quả băng thông, tất cả các tùy chọn rsync như giới hạn băng thông)
  • thực sự hiệu quả (không giống như sshfs giúp tiết kiệm thời gian đôi khi nhưng vẫn chậm trong thực tế)
  • không cần lệnh shell tùy ý phía máy chủ
  • không cần máy chủ để cho phép đường hầm ssh
  • không cần máy chủ để chạy rsyncdaemon

Tôi chưa thử nghiệm nó, nhưng tôi đã sử dụng thành công tất cả các tính năng đó ngoại trừ rrsync.

Làm thế nào để làm nó

  • tạo một khóa cục bộ với ssh-keygen(tính năng openSSH)
  • chỉ cho phép đăng nhập bằng khóa cụ thể đó, với một mục trong máy chủ ~/.ssh/authorized_keys(tính năng openSSH)
  • liên kết khóa này với một lệnh cụ thể, với ~/.ssh/authorized_keys(tính năng openSSH) bằng cách sử dụng lệnh như tập lệnh được rrsyncphân phối với rsync, đại loại nhưcommand="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-

Sau đó, bạn có thể rsync từ khách hàng bình thường.

Nếu bạn cần thêm chi tiết

Hạn chế quyền truy cập SSH vào rsync | Guy Rutenberg

Một bước vượt quá liên kết ở trên

Lệnh ở cuối trang đó có thể được thực hiện ngắn hơn. Trong ~/.ssh/configtạo ra một đoạn thơ như thế này:

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

sau đó lệnh rsync của bạn từ máy khách

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

trở thành

rsync -av user@remote: etc2/

1
Thật không may, điều này không liên quan gì đến việc sử dụng rsync với máy chủ SFTP, đây là về cách định cấu hình máy chủ OpenSSH để cho phép rsyncchạy, bỏ qua khía cạnh SFTP. Nếu bạn được trình bày với máy chủ SFTP của người khác mà bạn không có quyền kiểm soát nào thì câu trả lời này không thể giải quyết được vấn đề.
Malvineous

Bạn đúng. Tôi có thể đã thực sự viết điều này để trả lời một câu hỏi khác và đăng ở đây do nhầm lẫn. Tôi đang xem xét loại bỏ câu trả lời của tôi ở đây.
Stéphane Gourmetichon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.