Chạy rsync với quyền root trên máy từ xa


31

Tôi muốn đồng bộ thư mục từ máy của mình với thư mục trên máy từ xa. Các thư mục từ xa chỉ có thể được thao tác bởi root. Tôi có một tài khoản trên máy từ xa có thể sử dụng sudo. Làm cách nào tôi có thể chạy rsync sao cho nó có quyền root trên máy từ xa?

Tôi đã thử như sau:

rsync -avz -e ssh /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder --delete --rsync-path="sudo rsync"

Nhưng (sau khi nhập mật khẩu) tôi gặp lỗi sau:

sudo: no tty present and no askpass program specified

Bạn không thể thay đổi các quyền trên thư mục từ xa để người dùng của bạn có quyền ghi vào nó?
Phil

1
Thật không may, đó không phải là một lựa chọn.
Peter

Sẽ tốt hơn nhiều nếu kiểm tra câu trả lời cho cùng một câu hỏi trên Unix SE unix.stackexchange.com/questions/92123/ .
ndemou

Câu trả lời:


12

Hãy thử giải pháp này. Trong tệp sudoers của bạn ( /etc/sudoers) thiết lập người dùng của bạn như thế này:

username ALL= NOPASSWD:/usr/bin/rsync

các NOPASSWD:/usr/bin/rsyncbảo sudorằng khi sử dụng bạn chạy /usr/bin/rsynchoặc chỉ rsyncmà không có mật khẩu là cần thiết.

Sau đó, bản gốc của bạn --rsync-path="sudo rsync"nên làm việc.


Tôi đã sử dụng tùy chọn sudo rsync mà không đặt tên người dùng TẤT CẢ ... sau khi rsync hoàn tất. trên điều khiển từ xa khi tôi cố gắng để cd hoặc ls. Tôi được phép từ chối. mặc dù tôi đã root tôi phải sudo để ls. nhưng trong trường hợp của cd thì thậm chí là không thể. Tôi đã cố gắng để chown tất cả các thư mục và các tập tin. vẫn không làm việc có ai biết lý do và cách khắc phục không?
Dấu chấm phẩy đáng sợ

2
bạn cũng nên nói cách chỉnh sửa tệp sudoers
Jonathan

2
Vui lòng xem unix.stackexchange.com/a/92397/128237 để biết ý nghĩa bảo mật của bản sửa lỗi này.
BrainStorm.exe

11

Đây là giải pháp tôi đã đưa ra:

rsync -R -avz -e ssh --rsync-path="echo mypassword | sudo -S  mkdir -p /remote/lovely/folder && sudo rsync" /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder --delete

Một chút nhiệm vụ!


12
Tôi hy vọng bạn nhận ra mật khẩu của bạn sẽ hiển thị trong dòng lệnh. Nó sẽ hiển thị trong khoảng thời gian rsync đang chạy.
BillThor

1
mật khẩu hiển thị ở đâu? Chỉ trên hộp cục bộ trong dòng lệnh? Hay cách tiếp cận này cũng tạo ra lỗ hổng từ xa? Tôi đang cố gắng để hiểu câu trả lời ở trên và sự phân nhánh của việc sử dụng giải pháp này. Tôi đã hỏi một câu hỏi ở đây: superuser.com/questions/398146/ từ
MountainX

@MaxX Nó sẽ hiển thị trong danh sách các quy trình (ví dụ ps aux). Kiểm tra : rsync -R -avz -e ssh --rsync-path="find / > /dev/null && rsync" server.example.com:/ /tmp/example, sau đó mở terminal trên máy từ xa và ps aux | grep find. find /chỉ được sử dụng vì đó là điều đầu tiên tôi nghĩ đến với thời gian thực hiện lớn.
Ivan Vučica

1
Tôi biết điều này đã cũ nhưng, nếu bạn muốn tránh mật khẩu trong lệnh, bạn có thể sử dụng khóa cho ssh và trên máy từ xa thêm người dùng của bạn vào tệp sudoers bằng cờ NOPASSWD: ALL. Xem câu trả lời thứ hạng cao nhất tại liên kết sau. LƯU Ý: Đây không phải là câu trả lời được chấp nhận: askubfox.com/questions/147241/execute-sudo-without-password
Dave

10

Giải pháp trên blog này đã làm việc rất tốt cho tôi: http://www.pplux.com/2009/02/07/rsync-root-and-sudo/ .

Về cơ bản:

stty -echo; ssh myUser@REMOTE_SERVER "sudo -v"; stty echo  
rsync -avze ssh --rsync-path='sudo rsync' myUser@REMOTE_SERVER:/REMOTE_PATH/ LOCAL_PATH 

Dòng đầu tiên cho phép nhập mật khẩu tương tác, mà không hiển thị mật khẩu trên màn hình. Hoạt động tuyệt vời cho tôi trên Ubuntu 9.04.


1
Điều này đòi hỏi tùy chọn tty_tickets không được đặt : !tty_tickets.
xanh lam

2
Làm thế nào về ssh -t [other options]thay vì chơi với stty -echo?
Ivan Vučica

Tôi là trường hợp của tôi, tôi đã không đặt ra: tty_ticketsdù sao ... vì vậy tôi có thể thử phương pháp này.
MountainX

1
sudo: no tty present and no askpass program specified
Michael

Làm thế nào để bỏ đặt tty_tickets? Trên máy nào? Trong lệnh rsync này?
Jonathan

4

Bạn cần một phương thức để cung cấp mật khẩu sudo. Một askpasschương trình được thiết kế để yêu cầu mật khẩu khi các cơ chế bình thường không có sẵn. Thiết lập sudođể không yêu cầu mật khẩu để chạy rsyncvì userid của bạn là một tùy chọn.

Tôi thường cấu hình đăng nhập dựa trên khóa với các hạn chế thích hợp cho các trường hợp như thế này. Nếu bạn cấu hình một khóa bị hạn chế chỉ chạy rsyncbằng root thì loại điều này sẽ dễ thực hiện hơn. Một cách khác là sử dụng một rsycndquy trình để xử lý các yêu cầu từ xa. Cấu hình cung cấp một loạt các hạn chế có thể được áp dụng.

EDIT: Tôi đã bao gồm một tập lệnh để thiết lập các khóa cho các lỗi dựa trên khóa trong phần Tạo người dùng trên khách hàng trong bài đăng của tôi về Thiết lập BackupPC trên Linux . Xem thêm thông tin cho ssh_config, chi tiết một số điều bạn có thể làm với việc giới thiệu lại cách sử dụng khóa như được hiển thị trong tập lệnh.


Cảm ơn sự giúp đỡ của bạn, nhưng tôi đã tìm thấy một giải pháp phù hợp hơn với tôi.
Peter

bất kỳ chi tiết về đăng nhập keybasing?
TheVillageIdiot


2

Tôi ngạc nhiên bởi sự phức tạp của các câu trả lời hiện có. Đó là xa dễ dàng hơn và thuận tiện để cấu hình hệ thống của bạn (máy tính của bạn và máy chủ từ xa) để bạn có thể kết nối như là người chủ đến máy chủ từ xa mà không cần sử dụng một mật khẩu. Và không giống như vẻ ngoài của nó, nó cũng an toàn .

  1. Trên máy chủ từ xa, đảm bảo rằng / etc / ssh / sshd_config có dòng này "PermitRootLogin không có mật khẩu" (trong nhiều bản phân phối theo mặc định). Điều này cho phép root lấy shell ssh bằng bất kỳ phương thức xác thực nào ngoại trừ lời nhắc mật khẩu không an toàn.
  2. (Nếu bạn chưa biết cách) hãy làm theo bất kỳ hướng dẫn nào trong số nhiều hướng dẫn về cách lấy thông tin đăng nhập không cần mật khẩu qua ssh
  3. Sử dụng rsync như bạn thường làm và không có bất kỳ lời nhắc mật khẩu nào.

Chỉ cần đừng quên rằng miễn là dòng trong /root/.ssh/authorized_keys của máy chủ từ xa ở đó thì máy đó chấp nhận các lệnh gốc từ PC của bạn.


rrsync sử dụng phương pháp này.
MÃ-REaD

0

Đây là những gì làm việc cho tôi, xem xét rằng tôi muốn giữ xác thực mật khẩu (vì vậy tôi không muốn sử dụng NOPASSWDhoặc khóa) - trên Ubuntu 14.04:

  • "Mở" sudotrên máy từ xa bằng cách vô hiệu hóa tty_ticketsthông qua tệp tạm thời /etc/sudoers.d/(cần được hỗ trợ trên Debian, xem /etc/sudoers.d/README) và "Cập nhật thông tin đăng nhập được lưu trong bộ nhớ cache của người dùng", giúp "kéo dài thời gian chờ sudo thêm 15 phút nữa"
  • Chạy rsyncvới sudonhư trong câu trả lời khác
  • "Đóng cửa" sudotrên máy từ xa bằng cách xóa tệp tạm thời /etc/sudoers.d/, cho phép bật lạitty_tickets

... hoặc, với các dòng lệnh:

ssh -t $REMOTEPC 'echo "Defaults !tty_tickets" | sudo tee /etc/sudoers.d/temp; sudo -v'
rsync -aP -e 'ssh' '--rsync-path=sudo rsync' /etc/pulse/client.conf $REMOTEPC:/etc/pulse/client-copy.conf
ssh -t $REMOTEPC 'sudo rm -v /etc/sudoers.d/temp; sudo -v'

Đây là những phản hồi tôi nhận được khi chạy các lệnh này trên máy cục bộ:

$ ssh -t $REMOTEPC 'echo "Defaults !tty_tickets" | sudo tee /etc/sudoers.d/temp; sudo -v'
remoteuser@$REMOTEPC's password: 
[sudo] password for remoteuser: 
Defaults !tty_tickets
Connection to $REMOTEPC closed.

$ rsync -aP -e 'ssh' '--rsync-path=sudo rsync' /etc/pulse/client.conf $REMOTEPC:/etc/pulse/client-copy.conf
remoteuser@$REMOTEPC's password: 
sending incremental file list
client.conf
           1269 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=0/1)

$ ssh -t $REMOTEPC 'sudo rm -v /etc/sudoers.d/temp; sudo -v'
remoteuser@$REMOTEPC's password: 
removed ‘/etc/sudoers.d/temp’
[sudo] password for remoteuser: 
Connection to $REMOTEPC closed.

Lưu ý rằng sudo -vnên được chạy sau mỗi lần tập tin vào /etc/sudoers.d/, vì vậy những thay đổi trong đó được chấp nhận.


0

Một phương pháp khác là khắc phục các hạn chế về quyền bằng cách khởi tạo rsync trên máy từ xa. Thay vì:

rsync /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder

Bạn có thể làm:

ssh ubuntu@x.x.x.x 'rsync ubuntu@y.y.y.y:/home/ubuntu/my/lovely/folder /remote/lovely/folder'

y.y.y.yĐịa chỉ IP của máy cục bộ của bạn ở đâu . Điều này chỉ hoạt động nếu máy cục bộ của bạn có thể hoạt động như một máy chủ SSH.


1
Hừm ... bạn không sao chép cục bộ vào điều khiển từ xa trong dòng lệnh đầu tiên của bạn - và sau đó trong dòng lệnh thứ hai, tương đương với dòng đầu tiên, sao chép từ xa sang cục bộ (không tương đương với dòng đầu tiên)?
sdaau

Rất tiếc! Đã sửa nó.
Keith

0

Cách làm việc của tôi là thêm --rsync-path="echo PASSWORD | sudo -Sv && sudo rsync"

thí dụ:

rsync -avz -e ssh /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder --delete --rsync-path="echo <PASSWORD> | sudo -Sv && sudo rsync"

Nó thường không phải là một ý tưởng tốt để đặt mật khẩu vào một dòng lệnh; chúng trở nên hữu hình trong cây quy trình, ví dụ. Đôi khi tôi thay thế mật khẩu thực tế trong loại câu lệnh này bằng $ (cat my_password.txt) tốt hơn một chút

rsync -avz -e ssh /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder --delete --rsync-path="cat my_password.txt | sudo -Sv && sudo rsync"


Bạn có thể mở rộng về điều này với một chút bối cảnh và giải thích? "Thêm" vào cái gì, ở đâu? Tại sao điều này giải quyết vấn đề? Cảm ơn.
fixer1234
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.