web-dev-qa-db-fra.com

Exécuter rsync avec la permission root sur la machine distante

Je souhaite synchroniser un dossier de ma machine avec un dossier situé 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 d'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
29
Peter

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

Peu d'une mission!

11
Peter

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

username ALL= NOPASSWD:/usr/bin/rsync

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

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

11
dynabaul

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 d'un mot de passe sans afficher le mot de passe à l'écran. Fonctionne très bien pour moi sur Ubuntu 9.04.

10
Andrew

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. Configurer Sudo pour ne pas nécessiter de mot de passe pour exécuter rsync car votre ID utilisateur est une option.

Je configure normalement une connexion par clé avec des restrictions appropriées dans des cas comme celui-ci. Si vous configurez une clé restreinte qui exécute uniquement rsync en tant que root, ce type de tâche devient plus facile à faire. Une autre alternative consiste à utiliser un processus rsycnd pour gérer les demandes distantes. La configuration fournit diverses restrictions pouvant être appliquées.

ÉDITER: j’ai inclus un script pour configurer les clés pour les boucles à base de clés dans la section Création d’utilisateurs sur les clients de mon message sur Configuration de BackupPC sous Linux . Reportez-vous également à la documentation de ssh_config qui détaille certaines des choses que vous pouvez faire en limitant l'utilisation des clés, comme indiqué dans le script.

4
BillThor

sur machine distante

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

substitue le chemin vers ssh-askpass avec le chemin réel sur la machine distante

source: http://unix.bris.ac.uk/2015/08/04/rsync-between-two-hosts-using-Sudo-and-a-password-Prompt/

3
wotanii

Je suis émerveillé par la complexité des réponses existantes. C'est loin plus simple et plus 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 également sécurisé .

  1. Sur l'hôte distant, assurez-vous que/etc/ssh/sshd_config a cette ligne "PermitRootLogin sans mot de passe" (dans de nombreuses distributions, il est présent par défaut). Cela permet à root d’obtenir un shell ssh en utilisant n’importe quelle méthode d’authentification à l’exception de du mot de passe non sécurisé Prompt.
  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 invite de mot de passe.

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

2
ndemou

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 NOPASSWD ou clés) - sur Ubuntu 14.04:

  • "Ouvrez" Sudo sur une machine distante en désactivant tty_tickets via un fichier temporaire dans /etc/sudoers.d/ (qui devrait être pris en charge sous Debian, voir /etc/sudoers.d/README), et "Mettez à jour les informations d'identification mises en cache de l'utilisateur", ce qui "prolonge le délai d'expiration Sudo de 15 minutes supplémentaires".
  • Exécuter la rsync avec Sudo comme indiqué dans les autres réponses
  • "Fermez" Sudo sur la machine distante en supprimant le fichier temporaire dans /etc/sudoers.d/, ce qui réactivera tty_tickets

... ou avec les 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 je reçois 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 Sudo -v doit être exécuté après chaque fois que les fichiers sont dans /etc/sudoers.d/, de sorte que les modifications qu’ils contiennent sont acceptées.

0
sdaau

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.y est l'adresse IP de votre ordinateur local. Cela ne fonctionne que si votre ordinateur local peut agir en tant que serveur SSH.

0
Keith

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; ils deviennent visibles dans l'arbre de processus, par exemple. Je remplace parfois le mot de passe actuel 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"

0
Bulat