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é .
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'
Où 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/