Exécutez rsync avec l'autorisation root sur la machine distante

32

Je souhaite synchroniser un dossier de ma machine avec un dossier sur une machine distante. Le dossier distant ne peut être manipulé que par root. J'ai un compte sur la machine distante qui peut utiliser sudo. Comment puis-je exécuter rsync de sorte qu'il dispose des autorisations root sur la machine distante?

J'ai essayé ce qui suit:

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

Mais (après avoir entré mon mot de passe), j'obtiens l'erreur suivante:

sudo: no tty present and no askpass program specified
Peter
la source
Ne pouvez-vous pas modifier les autorisations sur le dossier distant afin que votre utilisateur y ait accès en écriture?
Phil
1
Malheureusement, ce n'est pas une option.
Peter
Il est préférable de vérifier la réponse à la même question sur Unix SE unix.stackexchange.com/questions/92123/… .
ndemou

Réponses:

12

Essayez cette solution. Dans votre fichier sudoers (/etc/sudoers ), configurez votre utilisateur comme ceci:

username ALL= NOPASSWD:/usr/bin/rsync

le NOPASSWD:/usr/bin/rsync dit sudoque lorsque votre utilisateur exécute /usr/bin/rsyncou tout simplement rsyncqu'aucun mot de passe est nécessaire.

Ensuite, votre original --rsync-path="sudo rsync"devrait fonctionner.

dynabaul
la source
J'ai utilisé l'option sudo rsync sans définir le nom d'utilisateur ALL ... après que rsync soit terminé. sur la télécommande lorsque j'essaie de cd ou ls. J'obtiens la permission refusée. même si je suis root. je dois sudo à ls. mais en cas de cd ce n'est même pas possible. J'ai essayé de chown tous les répertoires et fichiers. ne fonctionnait toujours pas. quelqu'un connaît la raison et comment y remédier?
Point-virgule
2
vous devez également dire comment modifier le fichier sudoers
Jonathan
2
Veuillez consulter unix.stackexchange.com/a/92397/128237 pour les implications de sécurité de ce correctif.
BrainStorm.exe
11

Voici la solution que j'ai trouvée:

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

Un peu de mission!

Peter
la source
12
J'espère que vous reconnaissez que votre mot de passe sera visible sur la ligne de commande. Il doit être visible pendant la durée d'exécution de rsync.
BillThor
1
où le mot de passe est-il visible? Juste sur la boîte locale dans la ligne de commande? Ou cette approche crée-t-elle également des vulnérabilités à distance? J'essaie de comprendre la réponse ci-dessus et les ramifications de l'utilisation de cette solution. J'ai posé une question ici: superuser.com/questions/398146/…
MountainX
@MountainX Il sera visible dans la liste des processus (par exemple ps aux). Testez:, rsync -R -avz -e ssh --rsync-path="find / > /dev/null && rsync" server.example.com:/ /tmp/examplepuis ouvrez le terminal sur la machine distante et ps aux | grep find. find /est utilisé uniquement car c'est la première chose qui m'est venue à l'esprit avec une grande durée d'exécution.
Ivan Vučica
1
Je sais que c'est ancien mais, si vous voulez éviter le mot de passe dans la commande, vous pouvez utiliser les clés pour ssh et sur la machine distante, ajoutez votre utilisateur au fichier sudoers avec l'indicateur NOPASSWD: ALL. Voir la réponse la plus élevée au lien suivant. REMARQUE: Ce n'est pas la réponse acceptée: askubuntu.com/questions/147241/execute-sudo-without-password
Dave
10

La solution sur ce blog a très bien fonctionné pour moi: http://www.pplux.com/2009/02/07/rsync-root-and-sudo/ .

Fondamentalement:

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

La première ligne permet la saisie interactive du mot de passe, sans afficher le mot de passe à l'écran. Fonctionne très bien pour moi sur Ubuntu 9.04.

Andrew
la source
1
Cela nécessite que l'option tty_tickets être unset: !tty_tickets.
blueyed
2
Et au ssh -t [other options]lieu de jouer avec stty -echo?
Ivan Vučica
Je mon cas, je l'ai déjà déçu: de tty_ticketstoute façon ... donc je peux essayer cette approche.
MountainX
1
sudo: no tty present and no askpass program specified
Michael
Comment désinstaller tty_tickets? Sur quelle machine? Pendant cette commande rsync?
Jonathan
4

Vous avez besoin d'une méthode pour fournir le mot de passe sudo. Un askpassprogramme est conçu pour demander des mots de passe lorsque les mécanismes normaux ne sont pas disponibles. La configuration sudopour ne pas nécessiter de mot de passe pour fonctionner rsynccar votre ID utilisateur est une option.

Je configure normalement une connexion basée sur des clés avec des restrictions appropriées pour des cas comme celui-ci. Si vous configurez une clé restreinte qui ne s'exécute qu'en rsynctant que root, ce genre de chose devient plus facile à faire. Une autre alternative consiste à utiliser unrsycnd processus pour gérer les requêtes distantes. La configuration fournit une variété de restrictions qui peuvent être appliquées.

EDIT: J'ai inclus un script pour configurer les clés pour les loings basés sur les clés dans la section Création d'utilisateurs sur les clients de mon article sur la configuration de BackupPC sur Linux . Voir aussi la documentation de ssh_config qui détaille certaines des choses que vous pouvez faire pour restituer l'utilisation des clés comme indiqué dans le script.

BillThor
la source
Merci pour votre aide, mais j'ai trouvé une solution qui fonctionne mieux pour moi.
Peter
des détails sur la connexion par clé?
TheVillageIdiot
2

Je suis étonné de la complexité des réponses existantes. Il est beaucoup plus facile et pratique de configurer vos systèmes (votre PC et l'hôte distant) afin de pouvoir vous connecter en tant que root à l'hôte distant sans utiliser de mot de passe. Et contrairement à son apparence, il est également sécurisé .

  1. Sur l'hôte distant, assurez-vous que / etc / ssh / sshd_config a cette ligne "PermitRootLogin without-password" (dans de nombreuses distributions, il est là par défaut). Cela permet à root d'obtenir un shell ssh en utilisant n'importe quelle méthode d'authentification sauf l' l'invite de mot de passe non sécurisé.
  2. (Si vous ne savez pas déjà comment) suivez l'un des nombreux tutoriels sur la façon d'obtenir une connexion sans mot de passe via ssh
  3. Utilisez rsync comme vous le feriez normalement et sans aucune invite de mot de passe.

N'oubliez pas que tant que la ligne dans /root/.ssh/authorized_keys de l'hôte distant est là, cette machine accepte les commandes root de votre PC.

ndemou
la source
rrsync utilise cette approche.
CODE-REaD
0

Voici ce qui a fonctionné pour moi, étant donné que je veux conserver l'authentification par mot de passe (donc je ne veux pas utiliser de NOPASSWDclés) - sur Ubuntu 14.04:

  • "Ouvrir" sudosur une machine distante en désactivant tty_ticketsvia un fichier temporaire dans /etc/sudoers.d/(qui devrait être supporté sur Debian, voir/etc/sudoers.d/README ), et "Mettre à jour les informations d'identification mises en cache de l'utilisateur", qui "prolonge le délai d'attente sudo pendant 15 minutes supplémentaires"
  • Exécutez le rsyncavecsudo comme indiqué dans les autres réponses
  • "Fermer" sudosur la machine distante en supprimant le fichier temporaire dans /etc/sudoers.d/, ce qui réactivetty_tickets

... ou, avec des lignes de commande:

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'

Voici les réponses que j'obtiens lors de l'exécution de ces commandes sur la machine locale:

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

Notez que cela sudo -vdevrait être exécuté après chaque fois que les fichiers sont entrés /etc/sudoers.d/, afin que les modifications y soient acceptées.

sdaau
la source
0

Une autre méthode consiste à contourner les restrictions d'autorisations en lançant rsync sur la machine distante. Au lieu de:

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

Tu peux faire:

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

y.y.y.yest l'adresse IP de votre machine locale. Cela ne fonctionne que si votre machine locale peut servir de serveur SSH.

Keith
la source
1
Hm ... ne copiez-vous pas local vers distant dans votre première ligne de commande - puis dans la deuxième ligne de commande, qui devrait être équivalente à la première, copiant le distant vers local (ce qui n'est pas équivalent à la première)?
sdaau
Oups! A corrigé.
Keith
0

Ma solution consiste à ajouter --rsync-path="echo PASSWORD | sudo -Sv && sudo rsync"

Exemple:

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

Ce n'est généralement pas une bonne idée de mettre des mots de passe dans une ligne de commande à une ligne; ils deviennent visibles par exemple dans l'arborescence des processus. Je remplace parfois le mot de passe réel dans ce type de déclaration par $ (cat my_password.txt) qui est légèrement meilleur

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
la source
Pouvez-vous développer cela avec un peu de contexte et d'explication? "ajouter" à quoi, où? Pourquoi cela résout-il le problème? Merci.
fixer1234