Uruchom rsync z uprawnieniami administratora na zdalnym komputerze


32

Chcę zsynchronizować folder z mojego komputera z folderem na komputerze zdalnym. Folderem zdalnym można manipulować tylko za pomocą root. Mam konto na zdalnym komputerze, z którego można korzystać sudo. Jak mogę uruchomić rsync, aby miał uprawnienia roota na zdalnym komputerze?

Próbowałem następujące:

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

Ale (po wprowadzeniu hasła) pojawia się następujący błąd:

sudo: no tty present and no askpass program specified

Czy nie możesz zmienić uprawnień do zdalnego folderu, aby użytkownik miał do niego dostęp do zapisu?
Phil

1
Niestety nie jest to opcja.
Peter

O wiele lepiej jest sprawdzić odpowiedź na to samo pytanie na Unix SE unix.stackexchange.com/questions/92123/… .
ndemou

Odpowiedzi:


12

Wypróbuj to rozwiązanie. W pliku sudoers ( /etc/sudoers) ustaw użytkownika w następujący sposób:

username ALL= NOPASSWD:/usr/bin/rsync

NOPASSWD:/usr/bin/rsyncmówi sudo, że gdy użytkownik uruchamia /usr/bin/rsynclub po prostu rsync, że hasło nie jest potrzebne.

Wtedy twój oryginał --rsync-path="sudo rsync"powinien działać.


Użyłem opcji sudo rsync bez ustawiania nazwy użytkownika WSZYSTKIE ... po zakończeniu rsync. na pilocie, gdy próbuję cd lub ls. Odmówiono mi pozwolenia. mimo że jestem rootem. muszę sudo do ls. ale w przypadku cd nawet nie jest to możliwe. Próbowałem przeglądać wszystkie katalogi i pliki. wciąż nie działał. ktoś zna przyczynę i jak to naprawić?
Przerażony średnikiem

2
powinieneś także powiedzieć, jak edytować plik sudoers
Jonathan

2
Informacje dotyczące wpływu tej poprawki na bezpieczeństwo można znaleźć na stronie unix.stackexchange.com/a/92397/128237
BrainStorm.exe

11

Oto rozwiązanie, które wymyśliłem:

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

Trochę misji!


12
Mam nadzieję, że rozpoznasz swoje hasło będzie widoczne w wierszu polecenia. Powinien być widoczny przez czas działania rsync.
BillThor 16.04. 11.04

1
gdzie jest widoczne hasło? Tylko na lokalnym polu w wierszu poleceń? Czy to podejście powoduje także zdalne luki w zabezpieczeniach? Próbuję zrozumieć powyższą odpowiedź i konsekwencje korzystania z tego rozwiązania. Zadałem pytanie tutaj: superuser.com/questions/398146/…
MountainX

@MountainX Będzie widoczny na liście procesów (np ps aux.). Test:, rsync -R -avz -e ssh --rsync-path="find / > /dev/null && rsync" server.example.com:/ /tmp/examplea następnie otwórz terminal na zdalnej maszynie i ps aux | grep find. find /jest używany tylko, ponieważ jest to pierwsza rzecz, która przyszła mi do głowy z długim czasem realizacji.
Ivan Vučica

1
Wiem, że jest stary, ale jeśli chcesz uniknąć hasła w poleceniu, możesz użyć kluczy dla ssh i na zdalnym komputerze dodaj użytkownika do pliku sudoers z flagą NOPASSWD: ALL. Zobacz najwyższą odpowiedź w poniższym linku. UWAGA: To nie jest zaakceptowana odpowiedź: askubuntu.com/questions/147241/execute-sudo-without-password
Dave

10

Rozwiązanie na tym blogu działało dla mnie naprawdę dobrze: http://www.pplux.com/2009/02/07/rsync-root-and-sudo/ .

Gruntownie:

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

Pierwszy wiersz pozwala na interaktywne wprowadzanie hasła, bez pokazywania hasła na ekranie. Działa świetnie dla mnie na Ubuntu 9.04.


1
To wymaga opcji tty_tickets być rozbrojony: !tty_tickets.
niebieskawy

2
A może ssh -t [other options]zamiast bawić się stty -echo?
Ivan Vučica

W moim przypadku już go rozbroiłem: w tty_ticketskażdym razie ... więc mogę spróbować tego podejścia.
MountainX

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

Jak rozbroić bilety tty_tickets? Na jakiej maszynie? Podczas tej komendy rsync?
Jonathan

4

Potrzebujesz metody, aby podać hasło sudo. askpassProgram jest zaprojektowany, aby poprosić o hasłami gdy normalne mechanizmy nie są dostępne. Konfigurowanie tak, sudoaby nie wymagało hasła do uruchomienia, rsyncponieważ identyfikator użytkownika jest jedną z opcji.

Zwykle konfiguruję logowanie oparte na kluczu z odpowiednimi ograniczeniami dla takich przypadków. Jeśli skonfigurujesz klucz zastrzeżony, który będzie działał tylko rsyncjako root, łatwiej będzie to zrobić. Inną alternatywą jest użycie rsycndprocesu do obsługi zdalnych żądań. Konfiguracja zapewnia szereg ograniczeń, które można zastosować.

EDYCJA: Dołączyłem skrypt do konfigurowania kluczy dla pętli opartych na kluczach w sekcji Tworzenie identyfikatorów użytkowników na moich klientach mojego wpisu na temat Konfigurowania BackupPC w systemie Linux . Zobacz także dokumentację dla ssh_config, która szczegółowo opisuje niektóre rzeczy, które możesz zrobić z ograniczeniem użycia klucza, jak pokazano w skrypcie.


Dziękuję za pomoc, ale znalazłem rozwiązanie, które działa dla mnie lepiej.
Peter

jakieś szczegóły dotyczące logowania za pomocą klucza?
TheVillageIdiot


2

Dziwi mnie złożoność istniejących odpowiedzi. O wiele łatwiej i wygodniej jest skonfigurować swoje systemy (komputer i zdalny host), aby można było łączyć się z hostem zdalnym bez hasła. I w przeciwieństwie do jego wyglądu jest również bezpieczny .

  1. Na zdalnym hoście upewnij się, że / etc / ssh / sshd_config ma wiersz „PermitRootLogin bez hasła” (w wielu dystrybucjach jest on domyślnie). Pozwala to rootowi na uzyskanie powłoki ssh przy użyciu dowolnej metody uwierzytelniania, z wyjątkiem niepewnego hasła.
  2. (Jeśli jeszcze nie wiesz jak) postępuj zgodnie z jednym z wielu samouczków, jak uzyskać logowanie bez hasła za pomocą ssh
  3. Użyj rsync tak jak zwykle i bez monitów o hasło.

Po prostu nie zapominaj, że dopóki linia w /root/.ssh/authorized_keys zdalnego hosta jest tam, maszyna akceptuje polecenia root z twojego komputera.


rrsync stosuje to podejście.
CODE-REaD

0

Oto, co zadziałało, biorąc pod uwagę, że chcę zachować uwierzytelnianie za pomocą hasła (więc nie chcę używać NOPASSWDani kluczy) - w systemie Ubuntu 14.04:

  • „Otwórz” sudona zdalnym komputerze, wyłączając tty_ticketsplik tymczasowy w /etc/sudoers.d/(który powinien być obsługiwany w Debianie, zobacz /etc/sudoers.d/README), i „Zaktualizuj poświadczenia użytkownika w pamięci podręcznej”, co „wydłuży limit czasu sudo o kolejne 15 minut”
  • Uruchom za rsyncpomocą, sudojak pokazano w innych odpowiedziach
  • „Zamknij” sudona zdalnym komputerze, usuwając plik tymczasowy /etc/sudoers.d/, który zostanie ponownie włączonytty_tickets

... lub z wierszami poleceń:

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'

Oto odpowiedzi, które otrzymuję po uruchomieniu tych poleceń na komputerze lokalnym:

$ 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.

Pamiętaj, że sudo -vnależy je uruchamiać po każdym wejściu plików /etc/sudoers.d/, więc zmiany w nich są akceptowane.


0

Inną metodą jest obejście ograniczeń uprawnień poprzez zainicjowanie rsync na zdalnym komputerze. Zamiast:

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

Możesz to zrobić:

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

Gdzie y.y.y.yjest adres IP twojego komputera lokalnego? Działa to tylko wtedy, gdy komputer lokalny może działać jako serwer SSH.


1
Hm ... czy nie kopiujesz lokalnego na zdalny w pierwszym wierszu poleceń - a następnie w drugim wierszu poleceń, który powinien być równoważny z pierwszym, kopiując zdalny na lokalny (który nie jest równoważny z pierwszym)?
sdaau,

Ups! Naprawione.
Keith,

0

Moim obejściem jest dodanie --rsync-path="echo PASSWORD | sudo -Sv && sudo rsync"

przykład:

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"

Zazwyczaj umieszczanie haseł w linii poleceń nie jest dobrym pomysłem; stają się widoczne na przykład w drzewie procesów. Czasem zastępuję rzeczywiste hasło w tego typu instrukcjach $ (cat my_password.txt), co jest nieco lepsze

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"


Czy możesz rozwinąć tę kwestię z małym kontekstem i wyjaśnieniem? „dodaj” do czego, gdzie? Dlaczego to rozwiązuje problem? Dzięki.
fixer1234,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.