Comment utiliser un fichier d'identité avec rsync?

125

Comment utiliser un fichier d'identité avec rsync?

C'est la syntaxe que je pense que je devrais utiliser avec rsync pour utiliser un fichier d'identité pour me connecter:

rsync -avz -e 'ssh -p1234 -i ~ / .ssh / 1234-identity' \
"/ local / dir /" [email protected]: "/ remote / dir /"

Mais ça me donne une erreur:

Avertissement: fichier d'identité ~ / .ssh / 1234-identity non accessible: aucun fichier ou répertoire de ce type.

Le fichier est bien, les permissions sont définies correctement, cela fonctionne lorsque vous faites ssh - mais pas avec rsync - du moins dans ma syntaxe. Qu'est-ce que je fais mal? Essaie-t-il de rechercher le fichier d'identité sur la machine distante? Si tel est le cas, comment spécifier que je souhaite utiliser un fichier d'identité sur ma machine locale ?

cwd
la source

Réponses:

86

Vous souhaiterez peut-être utiliser ssh-agentet ssh-addcharger la clé en mémoire. sshessaiera automatiquement les identités de ssh-agent s'il peut les trouver. Les commandes seraient

eval $(ssh-agent) # Create agent and environment variables
ssh-add ~/.ssh/1234-identity

ssh-agentest un démon utilisateur qui conserve en mémoire des clés ssh non chiffrées. ssh le trouve en fonction des variables d'environnement que ssh-agent génère lorsqu'il est exécuté. L'utilisation evalpour évaluer cette sortie crée les variables d'environnement. ssh-addest la commande qui gère la mémoire des clés. L'agent peut être verrouillé à l'aide de ssh-add. Une durée de vie par défaut pour une clé peut être spécifiée au démarrage de ssh-agent et / ou spécifiée pour une clé lors de son ajout.

Vous pouvez également configurer un fichier ~ / .ssh / config pour fournir le port et la définition de clé. (Voir `man ssh_config pour plus d'options.)

host 22.33.44.55
    IdentityFile ~/.ssh/1234-identity
    Port 1234

Un simple guillemet de la commande ssh empêchera l'expansion du shell qui est nécessaire pour ~ou $HOME. Vous pouvez utiliser le chemin d'accès complet ou relatif de la clé entre guillemets simples.

BillThor
la source
2
Les guillemets doubles et l'utilisation de $ HOME ont résolu mon problème. Pouvez-vous expliquer ce que font les deux premières commandes? J'étais déjà familier avec la configuration d'un fichier de configuration - le seul problème est lorsque j'ai plusieurs comptes sur un serveur. Je ne m'attends pas à ce que cela me permette de spécifier plusieurs fichiers d'identité pour le même hôte.
cwd
+1 Cela a résolu mon problème avec drone.io :) Merci beaucoup.
Bhargav Nanekalva
C'est génial. FTR, vous pouvez également spécifier le nom d'utilisateur par défaut pour vous connecter, par exemple User ubuntulors de la configuration d'une instance EC2 Ubuntu :) Merci!
DanielSmedegaardBuus
Si vous utilisez un shell de style csh (tel que fish), faites-leeval (ssh-agent -c)
Dave
77

Utilisez soit $HOME

rsync -avz -e "ssh -p1234  -i \"$HOME/.ssh/1234-identity\"" dir remoteUser@server:

ou chemin complet vers la clé:

rsync -avz -e "ssh -p1234  -i /home/username/.ssh/1234-identity" dir user@server:

Testé avec rsync 3.0.9 sur Ubuntu

Tombart
la source
3
Oui, cela fonctionne bien, pas besoin d'utiliser ssh-agent ou d'autres options de configuration.
laurent
2
+1: c'est un problème de globbing, tout comme vous ne pouviez pas faire "ls '~'"
Alex
$HOMEne fonctionnera pas entre des guillemets simples (pas de développement de variable), vous devez donc utiliser des guillemets doubles ou le chemin absolu.
anol
en standard Bash devrait fonctionner "$HOME"ou $HOMEsans aucune différence (c'est également "${HOME}"possible, si vous voulez compliquer les choses)
Tombart
J'ai changé les guillemets simples en doubles.
Steve Bennett
36

Vous devez spécifier le chemin absolu vers votre fichier de clé d'identité. C'est probablement une sorte de quirck dans rsync. (ça ne peut pas être parfait après tout)

J'ai rencontré ce problème il y a quelques jours à peine :-)

Alpha01
la source
Vous pouvez utiliser ~ mais vous ne pouvez pas l'intégrer entre guillemets simples, car il ne sera pas remplacé correctement par / home / username / vous devez utiliser des guillemets doubles pour que les correctifs fonctionnent correctement, voir la solution de @ilcavero
X Tian
24

Cela fonctionne pour moi

rsync -avz --rsh="ssh -p1234  -i ~/.ssh/1234-identity"  \
"/local/dir/" [email protected]:"/remote/dir/"
ilcavero
la source
2
Pour une raison quelconque, j'ai dû spécifier le chemin complet du fichier d'identité, c'est-à-dire /home/user/.ssh/1234-identity. Ensuite, cela a fonctionné. Peut-être parce que c'est alors une coquille différente, comme suggéré dans la réponse de Darhuuk.
osa
@osa tu m'as sauvé là-bas! J'avais un problème avec Drupal et rSYNC et le problème était le chemin ... bizarre.
Lee Woodman
6

Exécutez-vous la commande dans bash ou sh? Cela pourrait faire une différence. Essayez de remplacer ~par $HOME. Essayez de mettre entre guillemets la chaîne de l' -eoption.

Darhuuk
la source
6

utilisez le fichier de clé avec rsync:

rsync -rave "ssh -i /home/test/pkey_new.pem" /var/www/test/ [email protected]:/var/www/test
Avinash Raut
la source