Comment passer automatiquement le mot de passe pour la commande rsync SSH?

111

Je dois faire rsyncpar sshet que vous souhaitez le faire automatiquement sans qu'il soit nécessaire de passer le mot de passe sshmanuellement.

liysd
la source

Réponses:

44

Vous devez utiliser un fichier de clés sans mot de passe pour les connexions ssh scriptées. Il s'agit évidemment d'un risque de sécurité, veillez à ce que le fichier de clés lui-même soit correctement sécurisé.

Instructions pour configurer l'accès SSH sans mot de passe

Scientifique fou
la source
9
Il n'y a pas de possibilité de mettre un mot de passe dans un texte de commande?
liysd le
3
Pas facilement, il n'y a pas d'options pour cela dans ssh
Mad Scientist
Il convient de noter que ce n'est pas toujours possible de le faire (par exemple, de nombreuses implémentations de serveur ssh android sont assez limitées).
Ponkadoodle
@Ponkadoodle L'OP concerne les requêtes côté client, pas côté serveur. ssh -idevrait toujours être possible du côté client. Voulez-vous dire que le serveur peut ne pas prendre en charge tous les types de clés (par exemple ECDSA)? Ce ne serait cependant pas un problème majeur, juste un cas d'utilisation ssh-keygen -t. Est-ce que je manque quelque chose?
Jonathan H
1
Bien que cela puisse sembler un problème au début, c'est la bonne réponse. Les mots de passe sont des informations sensibles, et celles-ci ne doivent pas être stockées en clair ou utilisées avec négligence dans les programmes. C'est à cela que servent les fichiers de clés; renseignez-vous simplement sur les fichiers d'identité, rsync -eetssh -i .
Jonathan H
94

Utilisez l'utilitaire de fournisseur de mot de passe ssh non interactif "sshpass"

Sur Ubuntu

 sudo apt-get install sshpass

Commande à rsync

 /usr/bin/rsync -ratlz --rsh="/usr/bin/sshpass -p password ssh -o StrictHostKeyChecking=no -l username" src_path  dest_path
Rajendra
la source
4
Je sais que ce n'est pas la meilleure pratique, mais j'ai un NAS avec un SSHD paralysé qui ne fera pas d'authentification par clé. Cette réponse était la pièce manquante de mon puzzle de sauvegarde automatisée. Donc +1 pour la réponse de dernier recours
Mike Gossmann
8
Si vous ne pouvez pas utiliser un fichier de clés, mais ne veulent pas inclure le mot de passe dans la commande, vous pouvez l' écrire dans un fichier temporaire et l' inclure comme ceci: sshpass -p`cat .password` ssh [...]. Protégez ensuite votre .passwordfichier chmod 400 .passwordpour vous assurer que seul votre utilisateur peut le lire.
lutuh
5
Par souci d'exhaustivité, dans le cas d'un ssh'ing vers un serveur distant, le src_pathdevrait être server: path, comme ceci:server01.mydomain.local:/path/to/folder
harperville
c'est définitivement la bonne réponse! il vous permet de faire des scripts sans magie ssh, juste un script. ;) Kudos @Rajendra
Genuinefafa
1
puisque le -acommutateur sur rsync inclut -rlptgoD, vous pouvez raccourcir la commande comme ceci:rsync -az ...
Jannie Theunissen
24

Vous pouvez éviter l'invite de mot de passe sur la rsynccommande en définissant la variable d'environnementRSYNC_PASSWORD sur le mot de passe que vous souhaitez utiliser ou en utilisant l' --password-fileoption.

Dexter
la source
41
ne fonctionne que si le serveur de destination a le démon rsync en cours d'exécution
Darryl Hebbes
4
Même si cette réponse n'aide pas à moins d'utiliser le démon rsync, Google m'a atterri ici et c'était exactement ce dont j'avais besoin. Pour moi, j'avais besoin de rsync direct vers rsyncd, pas de ssh. Je viens d'utiliser l'option de fichier de mot de passe et j'ai parfaitement travaillé pour un script.
gregthegeek
15

Si vous ne pouvez pas utiliser de clés publiques / privées, vous pouvez utiliser expect:

#!/usr/bin/expect
spawn rsync SRC DEST
expect "password:"
send "PASS\n"
expect eof
if [catch wait] {
    puts "rsync failed"
    exit 1
}
exit 0

Vous devrez remplacer SRC et DEST par vos paramètres de source et de destination rsync normaux, et remplacer PASS par votre mot de passe. Assurez-vous simplement que ce fichier est stocké en toute sécurité!

Kainjow
la source
3
ces commandes ne sont pas disponibles sur monRed Hat Enterprise Linux Server release 5.11 (Tikanga)
To Kra
13

Je l'ai fait fonctionner comme ceci:

sshpass -p "password" rsync -ae "ssh -p remote_port_ssh" /local_dir  remote_user@remote_host:/remote_dir
andrey465
la source
quel serait le remote_port_sshréglage? Cela ressemble à un espace réservé pour une valeur réelle.
Max Williams le
6

Utilisez une clé ssh.

Regardez ssh-keygenetssh-copy-id .

Après cela, vous pouvez utiliser de rsynccette façon:

rsync -a --stats --progress --delete /home/path server:path
Guillaume Lebourgeois
la source
Si j'utilise key avec ssh j'écris: ssh u @ serv -i ./rsa Mais comment le faire dans rsync?
liysd
2
Si vous mettez la clé dans votre répertoire .ssh et lui donnez un nom standard (généralement id_rsa / id_rsa.pub), elle sera automatiquement récupérée par rsync.
Craig Trader
6

Une autre possibilité intéressante:

  1. générer une paire de clés RSA ou DSA (comme il a été décrit)
  2. mettre la clé publique sur l'hôte (comme cela a déjà été décrit)
  3. courir:
rsync --partial --progress --rsh = "ssh -i dsa_private_file" nom_hôte @ hôte: / home / me / d.

Remarque: -i dsa_private_file qui est votre clé privée RSA / DSA

Fondamentalement, cette approche est très similaire à celle décrite par @Mad Scientist, mais vous n'avez pas à copier votre clé privée dans ~ / .ssh. En d'autres termes, il est utile pour les tâches ad hoc (accès unique sans mot de passe)

xhudik
la source
5

Ce qui suit fonctionne pour moi:

SSHPASS='myPassword'
/usr/bin/rsync -a -r -p -o -g --progress --modify-window=1 --exclude /folderOne -s -u --rsh="/usr/bin/sshpass -p $SSHPASS ssh -o StrictHostKeyChecking=no -l root"  source-path  myDomain:dest-path  >&2

Je devais installer sshpass

mario
la source
2
-a implique déjà -rlptgoD et en général, il serait beaucoup plus utile d'avoir une ligne de commande réduite ici.
Christian
4

Il est difficile de saisir automatiquement le mot de passe de la commande rsync. Ma solution simple pour éviter le problème est de monter le dossier à sauvegarder. Utilisez ensuite une commande rsync locale pour sauvegarder le dossier monté.

mount -t cifs //server/source/ /mnt/source-tmp -o username=Username,password=password
rsync -a /mnt/source-tmp /media/destination/
umount /mnt/source-tmp
Andrew Seaford
la source
3

Bien que vous l'ayez déjà implémenté maintenant,

vous pouvez également utiliser n'importe quelle implémentation expect (vous trouverez des alternatives en Perl, Python: pexpect, paramiko, etc.)

Joao Figueiredo
la source
2

J'utilise un fichier VBScript pour faire cela sur la plate-forme Windows, il me serveur très bien.

set shell = CreateObject("WScript.Shell")
shell.run"rsync -a [email protected]:/Users/Name/Projects/test ."
WScript.Sleep 100
shell.SendKeys"Your_Password"
shell.SendKeys "{ENTER}"
joseph.smeng
la source
2

La solution officielle (et d'autres) étaient incomplètes lors de ma première visite, alors je suis revenu, des années plus tard, pour publier cette approche alternative au cas où d'autres se retrouveraient ici dans l'intention d'utiliser une paire de clés publique / privée:

Exécutez ceci à partir de la machine de sauvegarde cible, qui extrait de la sauvegarde source vers la sauvegarde cible

rsync -av --delete -e 'ssh -p 59333 -i /home/user/.ssh/id_rsa' [email protected]:/home/user/Server/ /home/keith/Server/

Exécutez cela à partir de la machine source, qui envoie de la source à la sauvegarde cible

rsync -av --delete -e 'ssh -p 59333 -i /home/user/.ssh/id_rsa' /home/user/Server/ [email protected]:/home/user/Server/

Et, si vous n'utilisez pas un autre port pour ssh, considérez les exemples les plus élégants ci-dessous:

Exécutez ceci à partir de la machine de sauvegarde cible, qui extrait de la sauvegarde source vers la sauvegarde cible:

sudo rsync -avi --delete [email protected]:/var/www/ /media/sdb1/backups/www/

Exécutez ceci à partir de la machine source, qui envoie de la source à la sauvegarde cible:

sudo rsync -avi --delete /media/sdb1/backups/www/ [email protected]:/var/www/

Si vous êtes toujours invité à entrer un mot de passe, vous devez vérifier votre configuration ssh /etc/ssh/sshd_configet vérifier que les utilisateurs de la source et de la cible ont chacun la clé ssh publique respective des autres en envoyant chacun avecssh-copy-id [email protected] .

(Encore une fois, c'est pour utiliser des paires de clés ssh sans mot de passe, comme une approche alternative, et non pour passer le mot de passe via un fichier.)

oemb1905
la source
Et une note secondaire importante est que dans l'exemple de port alternatif, vous dirigez ssh vers votre fichier de clé privée, et quand il exécute la commande sur la cible, il s'authentifie par rapport à sa clé publique.
oemb1905
-1

Suivant l'idée publiée par Andrew Seaford, cela se fait en utilisant sshfs:

echo "SuperHardToGuessPass:P" | sshfs -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no [email protected]:/mypath/ /mnt/source-tmp/ -o workaround=rename -o password_stdin
rsync -a /mnt/source-tmp/ /media/destination/
umount /mnt/source-tmp
lépe
la source