web-dev-qa-db-fra.com

Comment puis-je rsync sans demander de mot de passe, sans utiliser l'authentification par clé publique?

J'ai besoin d'exécuter rsync, sans qu'il me demande de mot de passe.

J'ai vu dans la page de manuel rsync qu'elle ne permet pas de spécifier le mot de passe comme argument de ligne de commande.
Mais j'ai remarqué qu'il permet de spécifier le mot de passe via la variable RSYNC_PASSWORD.

J'ai donc essayé d'exporter la variable, mais rsync continue de me demander un mot de passe.

export RSYNC_PASSWORD="abcdef"
rsync [email protected]:/abc /def

Qu'est-ce que je fais mal?

Veuillez considérer:

En d'autres termes, je dois avoir le RSYNC_PASSWORD approche de travail! :-)

52
Dor

Cette variable d'environnement de mot de passe ne semble être utilisée que lors de l'utilisation du protocole rsync:

rsync rsync://[email protected]:/abc /def

Pour que cela fonctionne, vous devez également exécuter rsync en tant que démon (--daemon option), ce qui est souvent fait en utilisant inetd.conf.

Lorsque vous utilisez ce protocole, abc doit correspondre à une cible définie dans /etc/rsyncd.conf. Le nom d'utilisateur doit être présent dans un auth users ligne pour cette cible, et un fichier de mot de passe doit être spécifié avec le secrets file option.

C'est ce fichier secret qui contient les mappages entre les noms d'utilisateur et les mots de passe au format suivant:

username:password

Et c'est ce mot de passe que vous pouvez spécifier en utilisant la variable d'environnement RSYNC_PASSWORD.

13
brm

Si le démon rsync ne fonctionne pas sur la machine cible et que vous ne vous souciez pas d'exposer les mots de passe à tout le monde sur la machine locale ( Pourquoi personne ne devrait-il utiliser des mots de passe dans la ligne de commande? ), vous pouvez utiliser sshpass:

 sshpass -p "password" rsync [email protected]:/abc /def

Notez l'espace au début de la commande, dans le shell bash, cela empêchera la commande (et le mot de passe) d'être stockés dans l'historique. Je ne recommande pas d'utiliser le RSYNC_PASSWORD variable sauf si absolument nécessaire (selon une modification précédente de cette réponse), je recommande de supprimer le stockage de l'historique ou au moins d'effacer l'historique après. De plus, vous pouvez utiliser tput reset pour effacer l'historique de votre terminal.

72
Graeme

Vous pouvez utiliser des identités ssh standard pour effectuer une connexion sans mot de passe. Ceci est géré par défaut si vous avez un ~/.ssh/id_rsa ou similaire, mais vous pouvez également coder en dur votre propre chemin vers la clé privée d'une paire de clés autorisée.

Cela permet la création de lots/scripts sans exposer les mots de passe, et la clé publique peut être supprimée du serveur cible si la clé privée est jamais compromise.

rsync -e"ssh -i /path/to/privateKey" -avR $sourcedir ${ruser}@${rhost}:~/${rdir}/

Vous pouvez également ajouter des arguments comme -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null pour ne pas forcer la vérification de la clé de l'hôte à distance. ! Attention - cela ouvre l'homme au milieu des attaques et c'est une mauvaise pratique générale!

16
Eddie

Très utile pour les scripts est d'utiliser --password-file option de ligne de commande.

  • Créez un fichier vide appelé rsync_pass
  • écrire un mot de passe dans ce fichier (rien de plus)
  • chmod 600 rsync_pass
  • rsync $args --password-file=rsync_pass user@rsynchost::/share localdirectory

Cela peut être utilisé pour les scripts et permet d'être plus sûr que d'exporter simplement le mot de passe vers une variable système.

13
Arunas Bartisius

J'ai écrit mon script en m'inspirant des commentaires de ce post, je vais donc le poster ici comme une autre source d'inspiration. Mes exigences étaient, pas de rsyncd à distance, une connexion par mot de passe, aucune exposition du mot de passe dans l'historique ou la ligne de commande. Ce n'est en fait pas très difficile:

#!/bin/bash

Host=mymachine.mydomain.com
USER=fms
LOCAL=/home/fms/Progetti/MyProject/src

read -s -p "Password for $USER@$Host: " SSHPASS
echo

sshpass -e rsync -i -r --checksum --delete --chown=nginx:nginx -e "ssh -o PreferredAuthentications=password" $LOCAL/lavori_senato $USER@$Host:/var/www/drupal/test/web/modules/custom

J'avais besoin de modifier la configuration par défaut de mon ssh pour qu'il n'essaye pas d'abord la clé publique. echo après read n'est qu'une touche de mise en forme, puisque l'utilisation de -s même la fin de la ligne n'est pas imprimée et la sortie de rsync chevauchait l'invite de mot de passe.