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:
rsync
, je ne peux pas utiliser d'autres logicielsEn d'autres termes, je dois avoir le RSYNC_PASSWORD
approche de travail! :-)
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.
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.
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!
Très utile pour les scripts est d'utiliser --password-file
option de ligne de commande.
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.
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.