Führen Sie rsync mit Root-Berechtigung auf dem Remotecomputer aus

29

Ich möchte einen Ordner von meinem Computer mit einem Ordner auf einem Remote-Computer synchronisieren. Der entfernte Ordner kann nur von manipuliert werden root. Ich habe ein Konto auf dem Remote-Computer, das verwendet werden kann sudo. Wie kann ich rsync so ausführen, dass es Root-Berechtigungen auf dem Remotecomputer hat?

Ich habe Folgendes versucht:

rsync -avz -e ssh /home/ubuntu/my/lovely/folder [email protected]:/remote/lovely/folder --delete --rsync-path="sudo rsync"

Aber (nachdem ich mein Passwort eingegeben habe) bekomme ich folgende Fehlermeldung:

sudo: no tty present and no askpass program specified
Peter
quelle
Können Sie die Berechtigungen für den Remote-Ordner nicht ändern, sodass Ihr Benutzer Schreibzugriff darauf hat?
Phil
1
Leider ist das keine Option.
Peter
Es ist viel besser, die Antwort auf dieselbe Frage in Unix SE unter unix.stackexchange.com/questions/92123/… zu überprüfen .
Ndemou

Antworten:

11

Dies ist die Lösung, die ich mir ausgedacht habe:

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

Eine kleine Mission!

Peter
quelle
9
Ich hoffe, Sie erkennen, dass Ihr Passwort in der Befehlszeile angezeigt wird. Es sollte für die Dauer der Ausführung von rsync sichtbar sein.
BillThor
1
Wo ist das Passwort sichtbar? Einfach auf der lokalen Box in der Kommandozeile? Oder schafft dieser Ansatz auch Sicherheitslücken in der Ferne? Ich versuche, die Antwort oben und die Auswirkungen der Verwendung dieser Lösung zu verstehen. Ich habe hier eine Frage gestellt: superuser.com/questions/398146/…
MountainX
@MountainX Wird in der Liste der Prozesse angezeigt (z ps aux. B. ). Test rsync -R -avz -e ssh --rsync-path="find / > /dev/null && rsync" server.example.com:/ /tmp/example:, öffnen Sie dann das Terminal auf der Remote-Maschine und ps aux | grep find. find /wird nur verwendet, da es das erste ist, was mir mit großer Ausführungsdauer in den Sinn gekommen ist.
Ivan Vučica
1
Ich weiß, dass dies alt ist, aber wenn Sie das Kennwort im Befehl vermeiden möchten, können Sie Schlüssel für ssh verwenden und auf dem Remote-Computer Ihren Benutzer mit dem Flag NOPASSWD: ALL zur sudoers-Datei hinzufügen. Die Antwort mit dem höchsten Rang finden Sie unter dem folgenden Link. HINWEIS
Dave
11

Versuchen Sie diese Lösung. In Ihrer sudoers-Datei ( /etc/sudoers) richten Sie Ihren Benutzer folgendermaßen ein:

username ALL= NOPASSWD:/usr/bin/rsync

Das NOPASSWD:/usr/bin/rsyncsagt, sudodass, wenn Ihr Benutzer ausgeführt wird /usr/bin/rsyncoder nur, rsyncdass kein Kennwort benötigt wird.

Dann sollte Ihr Original --rsync-path="sudo rsync"funktionieren.

Dynabaul
quelle
Ich habe die Option sudo rsync verwendet, ohne den Benutzernamen ALL festzulegen ... nachdem rsync abgeschlossen wurde. auf der fernbedienung wenn ich versuche zu cd oder ls. Ich bekomme die Erlaubnis verweigert. obwohl ich root bin. ich muss sudo zu ls. bei cd ist das aber gar nicht möglich. Ich habe versucht, alle Verzeichnisse und Dateien zu finden. hat immer noch nicht funktioniert. Kennt jemand den Grund und wie man es behebt?
Gefürchtetes Semikolon
2
Sie sollten auch sagen, wie Sie die sudoers-Datei bearbeiten
Jonathan
1
Informationen zu den Sicherheitsaspekten dieses Fixes finden Sie unter unix.stackexchange.com/a/92397/128237 .
BrainStorm.exe
10

Die Lösung in diesem Blog hat für mich sehr gut funktioniert: http://www.pplux.com/2009/02/07/rsync-root-and-sudo/ .

Grundsätzlich gilt:

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

In der ersten Zeile kann ein interaktives Kennwort eingegeben werden, ohne dass das Kennwort auf dem Bildschirm angezeigt wird. Funktioniert hervorragend für Ubuntu 9.04.

Andrew
quelle
1
Dies erfordert die tty_tickets Option nicht gesetzt werden: !tty_tickets.
blueyed
2
Wie wäre es ssh -t [other options]statt mit zu spielen stty -echo?
Ivan Vučica
Ich meinen Fall habe ich schon ungeklärt: tty_ticketssowieso ... damit ich diesen Ansatz probieren kann.
MountainX
1
sudo: no tty present and no askpass program specified
Michael
Wie deaktiviert man tty_tickets? Auf welcher Maschine? Während dieses Rsync-Befehls?
Jonathan
4

Sie benötigen eine Methode, um das Kennwort für anzugeben sudo. Ein askpassProgramm fragt nach Passwörtern, wenn die normalen Mechanismen nicht verfügbar sind. Das Einrichten sudo, dass kein Kennwort erforderlich ist, um rsyncals Benutzer-ID ausgeführt zu werden, ist eine Option.

Normalerweise konfiguriere ich die schlüsselbasierte Anmeldung mit entsprechenden Einschränkungen für Fälle wie diesen. Wenn Sie einen eingeschränkten Schlüssel konfigurieren, der nur rsyncals Root ausgeführt wird, ist dies einfacher. Eine andere Alternative besteht darin, einen rsycndProzess zum Behandeln der Remote-Anforderungen zu verwenden. Die Konfiguration bietet eine Reihe von Einschränkungen, die angewendet werden können.

BEARBEITEN: Ich habe ein Skript zum Einrichten von Schlüsseln für schlüsselbasierte Loings in den Abschnitt Erstellen von Benutzer-IDs auf Clients in meinem Beitrag zum Einrichten von BackupPC unter Linux aufgenommen . Siehe auch die Dokumentation zu ssh_config, in der einige der im Skript gezeigten Möglichkeiten zur Einschränkung der Schlüsselverwendung beschrieben sind.

BillThor
quelle
Vielen Dank für Ihre Hilfe, aber ich habe eine Lösung gefunden, die für mich besser funktioniert.
Peter
Gibt es Details zum keybasierten Login?
TheVillageIdiot
2

Ich bin erstaunt über die Komplexität der vorhandenen Antworten. Es ist viel einfacher und bequemer, Ihre Systeme (Ihren PC und den Remote-Host) so zu konfigurieren, dass Sie als Root ohne Kennwort eine Verbindung zum Remote-Host herstellen können. Und anders als es aussieht, ist es auch sicher .

  1. Stellen Sie auf dem Remote-Host sicher, dass in / etc / ssh / sshd_config die Zeile "PermitRootLogin without-password" (in vielen Distributionen standardmäßig vorhanden) angegeben ist. Auf diese Weise kann root eine SSH-Shell mit einer beliebigen Authentifizierungsmethode außer der Aufforderung zur Eingabe eines unsicheren Kennworts abrufen.
  2. (Wenn Sie noch nicht wissen, wie) Befolgen Sie eines der zahlreichen Tutorials , um ein passwortloses Login über ssh zu erhalten
  3. Verwenden Sie rsync wie gewohnt und ohne Passwortabfragen.

Vergessen Sie jedoch nicht, dass der Computer Root-Befehle von Ihrem PC akzeptiert, solange die Zeile in /root/.ssh/authorized_keys des Remote-Hosts vorhanden ist.

ndemou
quelle
rrsync verwendet diesen Ansatz.
CODE-REaD
0

Hier ist, was bei mir funktioniert hat, wenn ich bedenke, dass ich die Kennwortauthentifizierung beibehalten möchte (damit ich weder NOPASSWDSchlüssel noch Schlüssel verwenden möchte ) - unter Ubuntu 14.04:

  • "Öffnen" Sie den sudoRemote-Computer, indem Sie ihn tty_ticketsüber eine temporäre Datei in deaktivieren /etc/sudoers.d/(die unter Debian unterstützt werden sollte, siehe /etc/sudoers.d/README) und "Aktualisieren Sie die zwischengespeicherten Anmeldeinformationen des Benutzers", wodurch "das Sudo-Timeout um weitere 15 Minuten verlängert wird".
  • Führen Sie das rsyncmit sudowie in anderen Antworten gezeigt aus
  • "Herunterfahren" sudoauf dem Remotecomputer durch Entfernen der temporären Datei /etc/sudoers.d/, die erneut aktiviert wirdtty_tickets

... oder mit Kommandozeilen:

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'

Dies sind die Antworten, die ich bekomme, wenn ich diese Befehle auf dem lokalen Computer ausführe:

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

Beachten Sie, dass sudo -vnach jedem Einspielen von Dateien ausgeführt werden sollte /etc/sudoers.d/, damit die darin vorgenommenen Änderungen akzeptiert werden.

sdaau
quelle
0

Eine andere Methode besteht darin, die Berechtigungsbeschränkungen zu umgehen, indem Sie rsync auf dem Remotecomputer starten. Anstatt von:

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

Du kannst tun:

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

Wo y.y.y.yist die IP-Adresse Ihres lokalen Computers? Dies funktioniert nur, wenn Ihr lokaler Computer als SSH-Server fungieren kann.

Keith
quelle
1
Hm ... kopierst du nicht in deiner ersten Kommandozeile von lokal nach fern - und dann in der zweiten Kommandozeile, die der ersten entsprechen sollte, von fern nach lokal (was nicht der ersten entspricht)?
Sdaau
Hoppla! Behoben.
Keith
0

Mein Workuround ist das Hinzufügen --rsync-path="echo PASSWORD | sudo -Sv && sudo rsync"

Beispiel:

rsync -avz -e ssh /home/ubuntu/my/lovely/folder [email protected]:/remote/lovely/folder --delete --rsync-path="echo <PASSWORD> | sudo -Sv && sudo rsync"

In der Regel ist es keine gute Idee, Kennwörter einzeilig in die Befehlszeile einzufügen. Sie werden beispielsweise im Prozessbaum sichtbar. Ich ersetze manchmal das eigentliche Passwort in dieser Art von Anweisung durch $ (cat my_password.txt), was etwas besser ist

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
quelle
Können Sie dies mit einem kleinen Kontext und einer Erklärung erläutern? "addieren" zu was, wo? Warum löst dies das Problem? Vielen Dank.
Fixer1234