Como você usa um arquivo de identidade com o rsync?

125

Como você usa um arquivo de identidade com o rsync?

Esta é a sintaxe que acho que devo usar com o rsync para usar um arquivo de identidade para conectar:

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

Mas está me dando um erro:

Aviso: Arquivo de identidade ~ / .ssh / 1234-identity não acessível: Esse arquivo ou diretório não existe.

O arquivo está correto, as permissões estão definidas corretamente, funciona ao executar ssh - mas não com o rsync - pelo menos na minha sintaxe. O que estou fazendo de errado? Está tentando procurar o arquivo de identidade na máquina remota? Em caso afirmativo, como especifico que desejo usar um arquivo de identidade na minha máquina local ?

cwd
fonte

Respostas:

86

Você pode usar ssh-agente ssh-addcarregar a chave na memória. sshtentará identidades do ssh-agent automaticamente, se puder encontrá-las. Comandos seriam

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

ssh-agenté um daemon de usuário que contém chaves ssh não criptografadas na memória. O ssh o encontra com base nas variáveis ​​de ambiente que o ssh-agent produz quando executado. Usar evalpara avaliar esta saída cria as variáveis ​​de ambiente. ssh-addé o comando que gerencia a memória das teclas. O agente pode ser bloqueado usando ssh-add. A vida útil padrão de uma chave pode ser especificada quando o ssh-agent é iniciado e ou especificada para uma chave quando é adicionada.

Você também pode querer configurar um arquivo ~ / .ssh / config para fornecer a definição de porta e chave. (Veja `man ssh_config para mais opções.)

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

A citação única do comando ssh impedirá a expansão do shell necessária para ~ou $HOME. Você pode usar o caminho completo ou relativo para a chave entre aspas simples.

BillThor
fonte
2
Aspas duplas e usar $ HOME resolveram o meu problema. Você pode elaborar o que os dois primeiros comandos estão fazendo? Eu já estava familiarizado com a configuração de um arquivo de configuração - o único problema é quando tenho várias contas em um servidor. Não espero que isso me permita especificar vários arquivos de identidade para o mesmo host.
Cwd
+1 Isso corrigiu meu problema com o drone.io :) Muito obrigado.
Bhargav Nanekalva
Isso é incrível. FTR, você também pode especificar o nome de usuário padrão para se conectar, por exemplo, User ubuntuao configurar uma instância do EC2 Ubuntu :) Obrigado!
DanielSmedegaardBuus
Se você estiver usando o shell estilo csh (como fish), façaeval (ssh-agent -c)
Dave
77

Use um $HOME

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

ou caminho completo para a chave:

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

Testado com rsync 3.0.9 no Ubuntu

Tombart
fonte
3
Sim, isso funciona bem, não há necessidade de usar o ssh-agent ou outras opções de configuração.
laurent
2
+1: esta é uma questão englobamento, assim como você não podia fazer "ls '~'"
Alex
$HOMEnão funcionará dentro de aspas simples (sem expansão variável); portanto, você deve usar aspas duplas ou o caminho absoluto.
anol
em Bash padrão deve funcionar "$HOME"ou $HOMEsem qualquer diferença (também "${HOME}"é possível, se você quiser torná-lo complicado)
Tombart
Mudei as aspas simples para duplas.
Steve Bennett
36

Você deve especificar o caminho absoluto para o seu arquivo de chave de identidade. Provavelmente isso é uma espécie de truque no rsync. (não pode ser perfeito, afinal)

Encontrei este problema há apenas alguns dias :-)

Alpha01
fonte
Você pode usar ~, mas não pode incorporá-lo entre aspas simples, porque não é substituído corretamente em / home / nome de usuário / você deve usar aspas duplas para corrigir o funcionamento correto, consulte a solução de @ilcavero
X Tian
24

Isso funciona para mim

rsync -avz --rsh="ssh -p1234  -i ~/.ssh/1234-identity"  \
"/local/dir/" [email protected]:"/remote/dir/"
ilcavero
fonte
2
Por alguma razão, tive que especificar o caminho completo para o arquivo de identidade, ou seja /home/user/.ssh/1234-identity. Então funcionou. Possivelmente porque é então uma concha diferente, como sugerido na resposta de Darhuuk.
Osa
@osa você me salvou lá! Eu estava tendo um problema com o Drupal e o rSYNC e o problema era o caminho ... estranho.
Lee Woodman
6

Você está executando o comando no bash ou sh? Isso pode fazer a diferença. Tente substituir ~por $HOME. Tente citar duas vezes a string da -eopção.

Darhuuk
fonte
6

use o arquivo de chave com rsync:

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