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

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 à distance qui peut utiliser sudo . Comment puis-je exécuter rsync de telle sorte qu'il ait des autorisations root sur la machine distante?

J'ai essayé ce qui suit:

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

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

 sudo: no tty present and no askpass program specified 

C'est la solution avec laquelle je suis arrivé:

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

Un peu d'une mission!

La solution sur ce blog m'a vraiment bien réussi: http://www.pplux.com/2009/02/07/rsync-root-and-sudo/ .

En gros:

 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 l'entrée interactive du mot de passe, sans afficher le mot de passe sur l'écran. Fonctionne vraiment pour moi sur Ubuntu 9.04.

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

 username ALL= NOPASSWD:/usr/bin/rsync 

NOPASSWD:/usr/bin/rsync indique à sudo que lorsque votre utilisateur s'exécute /usr/bin/rsync ou simplement rsync , aucun mot de passe n'est nécessaire.

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

Vous avez besoin d'une méthode pour fournir le mot de passe à sudo . Un programme askpass est conçu pour demander des mots de passe lorsque les mécanismes normaux ne sont pas disponibles. Configuration de sudo pour ne pas nécessiter de mot de passe pour exécuter rsync car votre userid est une option.

Je configure normalement la connexion basée sur les clés avec les restrictions appropriées pour des cas comme celui-ci. Si vous configurez une clé restreinte qui ne fonctionne que rsync tant que root, ce type de chose devient plus facile à faire. Une autre alternative consiste à utiliser un processus rsycnd pour gérer les demandes à distance. La configuration offre 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éer des utilisateurs sur les clients de ma publication sur Configuration de BackupPC sur Linux . Voir aussi la documentation pour ssh_config qui détaille certaines des choses que vous pouvez faire avec l'utilisation de la clé restreinte comme indiqué dans le script.

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 que vous puissiez vous connecter en tant que root à l'hôte distant sans utiliser de mot de passe. Et contrairement à son apparence, il est aussi sécurisé .

  1. Sur l'hôte distant assurez-vous que / etc / ssh / sshd_config dispose de cette ligne "PermitRootLogin sans mot de passe" (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, à l' exception de l'invite du mot de passe non sécurisé.
  2. (Si vous ne savez déjà pas comment) suivre l'un des nombreux tutoriels sur la façon d'obtenir un login 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 racines de votre PC.

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 ubuntu@xxxx:/remote/lovely/folder 

Tu peux faire:

 ssh ubuntu@xxxx 'rsync /remote/lovely/folder ubuntu@yyyy:/home/ubuntu/my/lovely/folder' 

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

Sur machine à distance

 sudo apt install ssh-askpass which ssh-askpass 

Puis sur la machine locale

 rsync -av -e 'ssh -X' --rsync-path='SUDO_ASKPASS=/usr/libexec/openssh/ssh-askpass sudo -A rsync' /some/local/path user@remote:/some/remote/path 

Remplacez le chemin de ssh-askpass par le chemin réel sur la machine distante

Source: http://unix.bris.ac.uk/2015/08/04/rsync-entre -two – hosts – using – sudo- and-a- password – prompt/