78 votes

Utiliser rsync avec sudo sur la machine de destination

Avoir un problème : rsync ne définit pas l'UID et le GID comme prévu mon intuition me dit que rsync doit être exécuté en tant que root sur la machine de destination.

Je ne peux pas me connecter en tant que root via SSH, puisque c'est désactivé pour des raisons de sécurité. L'utilisateur de la machine de destination est en mesure d'utiliser la fonction sudo .

Est-il possible d'utiliser rsync con sudo ?

144voto

Thomas Weller Points 3578

Sur la machine de destination

  1. Découvrez le chemin vers rsync : which rsync
  2. Modifier le /etc/sudoers fichier : sudo visudo (voir aussi : dois-je utiliser visudo ? )
  3. Ajoutez la ligne <username> ALL=NOPASSWD:<path to rsync>nom d'utilisateur est le nom de connexion de l'utilisateur que rsync utilisera pour se connecter. Cet utilisateur doit être capable d'utiliser sudo

Ensuite, sur la machine source, spécifiez que sudo rsync doit être utilisé :

rsync ... --rsync-path="sudo rsync" ...

L'utiliser sans le NOPASSWD sur la machine de destination, le message

sudo : aucun tty présent et aucun programme askpass spécifié

10voto

fanky Points 91

Ma solution consiste à utiliser --rsync-path="sudo rsync" S'il demande un mot de passe, vous pouvez utiliser une solution de contournement comme celle-ci :

rsync -avz --stats --rsync-path="echo <SUDOPASS> | sudo -Sv && sudo rsync"  user@192.168.1.2:/ .

Cependant, il est préférable de ne pas taper votre mot de passe sur la ligne de commande, où il sera stocké dans l'historique du terminal. À la place, vous pouvez utiliser read -s pour demander le mot de passe sans le montrer :

read -s -p "Remote sudo password: " SUDOPASS && rsync -avz --stats --rsync-path="echo $SUDOPASS | sudo -Sv && sudo rsync"  user@192.168.1.2:/ .

(Note : -p pour l'invite n'est pas supporté par tous les shells (par exemple zsh), si vous obtenez une erreur, vous pouvez le laisser éteint, ou faire écho avant de lire à la place)

6voto

Bill Burdick Points 161

Vous pouvez demander au sudo distant de vous demander votre mot de passe via X-Windows. Voici un moyen de le faire :

  1. Assurez-vous que ssh-askpass est installée sur l'hôte distant (et que vous utilisez X-Windows, bien sûr)

  2. Assurez-vous que c'est dans /etc/sudo.conf :

    Path to askpass helper program

    Path askpass /usr/bin/ssh-askpass

  3. Ajoutez ces options à rsync : -e "ssh -X" --rsync-path="sudo -A rsync"

    • ssh -X transmettra vos informations sur X-Windows et le port à votre session distante
    • sudo -A fera en sorte que sudo utilise ssh-askpass pour vous demander votre mot de passe

1voto

Simon Schmid Points 11

S'il n'y a pas d'accès au fichier sudoers, créez simplement un script pour la commande ssh.

ssh_sudo :

{ 
  echo $PASSWORD;
  cat - ;
} | ssh $* &

Dans un premier temps, il transmet le mot de passe au processus sudo du client ssh afin de lancer rsync du côté distant. Ensuite, toutes les entrées provenant du rsync local sont transmises à ssh.

Enfin, appelez rsync, par exemple avec :

PASSWORD=<SUDOPASS> rsync -avzue ssh_sudo --rsync-path "sudo -S rsync" SRC DST

Je suppose que l'aspect sécurité n'est pas si mauvais, vous n'aurez qu'à sauvegarder le mot de passe localement comme env var. La lecture à partir d'un fichier devrait également fonctionner...

1voto

john Points 1533

En essayant de résoudre ce même problème dans le ansible synchronize Je suis tombé sur cette question et je voudrais attirer l'attention sur la solution. https://askubuntu.com/a/1263657/874618 par Simon Schmid. Je ne peux pas voter ou commenter en utilisant mon compte (pas assez de points de réputation), donc je vais poster ceci comme une autre réponse :

La solution de Simon n'est pas seulement l'alternative la plus sûre, car elle ne nécessite aucune modification de l'infrastructure de l'entreprise. sudoers et transmet le mot de passe en utilisant l'environnement (afin qu'il n'apparaisse pas dans les fichiers d'historique et les journaux), il fonctionne également sans modification de l'élément cible machine, ce qui est très pratique si vous voulez rsync à de nombreuses machines récentes et ne veulent pas les reconfigurer juste pour cette commande.

Après avoir joué un peu avec, j'ai réussi à mettre en ligne les commandes Shell utilisées pour emballer ssh en el hôte Il est donc possible de n'utiliser qu'une seule machine. rsync ligne :

PASSWORD=<SUDOPASS> rsync -avzue '/bin/sh -c "{ echo $PASSWORD; cat - ; } | ssh $0 $* &"' --rsync-path "sudo -S rsync" SRC DST

Bonne synchronisation ;-)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X