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 [email protected]:/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
Piotr
źródło
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ć.

dynabaul
źródło
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 [email protected]:/remote/lovely/folder --delete

Trochę misji!

Piotr
źródło
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.

Andrzej
źródło
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.

BillThor
źródło
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.

ndemou
źródło
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.

sdaau
źródło
0

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

rsync /home/ubuntu/my/lovely/folder [email protected]:/remote/lovely/folder

Możesz to zrobić:

ssh [email protected] 'rsync [email protected]:/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.

Keith
źródło
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 [email protected]:/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 [email protected]:/remote/lovely/folder --delete --rsync-path="cat my_password.txt | sudo -Sv && sudo rsync"

Bulat
źródło
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,