Como passar a senha automaticamente para o comando rsync SSH?

111

Eu preciso fazer rsyncpor sshe quer fazê-lo automaticamente, sem a necessidade de passar a senha para sshmanualmente.

liysd
fonte

Respostas:

44

Você deve usar um arquivo de chave sem senha para logins de ssh com script. Isso é obviamente um risco de segurança, tome cuidado para que o arquivo de chaves em si esteja adequadamente protegido.

Instruções para configurar o acesso SSH sem senha

Cientista maluco
fonte
9
Não há possibilidade de colocar senha em um texto de comando?
liysd
3
Não é fácil, não há opções para isso em ssh
Mad Scientist
Deve-se notar que isso nem sempre é possível (por exemplo, muitas implementações de servidor ssh para Android são bastante limitadas).
Ponkadoodle
@Ponkadoodle O OP trata de solicitações do lado do cliente, não do lado do servidor. ssh -isempre deve ser possível do lado do cliente. Você quer dizer que o servidor pode não suportar todos os tipos de chave (por exemplo, ECDSA)? Isso não seria um grande problema, apenas um caso de uso ssh-keygen -t. Estou esquecendo de algo?
Jonathan H
1
Embora possa parecer um incômodo no início, esta é a resposta correta. As senhas são informações confidenciais e não devem ser armazenadas de forma clara ou usadas descuidadamente em programas. É para isso que servem os arquivos-chave; apenas aprenda sobre os arquivos de identidade rsync -eessh -i .
Jonathan H
94

Use o utilitário de provedor de senha ssh não interativo "sshpass"

No Ubuntu

 sudo apt-get install sshpass

Comando para rsync

 /usr/bin/rsync -ratlz --rsh="/usr/bin/sshpass -p password ssh -o StrictHostKeyChecking=no -l username" src_path  dest_path
Rajendra
fonte
4
Eu sei que esta não é a prática recomendada, mas eu tenho um NAS com um SSHD inválido que não faz autenticação baseada em chave. Essa resposta era a peça que faltava em meu quebra-cabeça de backup automatizado. Então, +1 para a resposta de último recurso
Mike Gossmann
8
Se você não pode usar um arquivo de chave, mas não quer incluir a senha no comando, você pode escrevê-lo em um arquivo temporário e incluí-lo como este: sshpass -p`cat .password` ssh [...]. Em seguida, proteja seu .passwordarquivo chmod 400 .passwordpara garantir que apenas o usuário possa lê-lo.
lutuh
5
Para completar, no caso de ssh'ing para um servidor remoto, o src_pathdeve ser server: path, assim:server01.mydomain.local:/path/to/folder
harperville
esta é definitivamente a resposta certa! ele permite que você faça scripts sem a magia do ssh, apenas um script. ;) Kudos @Rajendra
genuínofafa
1
como -aa ativação do rsync inclui -rlptgoD, você pode encurtar o comando desta forma:rsync -az ...
Jannie Theunissen
24

Você pode evitar o prompt de senha no rsynccomando, definindo a variável de ambiente RSYNC_PASSWORDpara a senha que você deseja usar ou usando a --password-fileopção.

Dexter
fonte
41
só funciona se o servidor de destino tiver o daemon rsync em execução
Darryl Hebbes
4
Mesmo que essa resposta não ajude a menos que use o daemon rsync, o Google me trouxe aqui e era exatamente o que eu precisava. Para mim, eu precisava de rsync direto para rsyncd, sem ssh. Acabei de usar a opção de arquivo de senha e funcionou perfeitamente para um script.
Gregthegeek
14

Se você não pode usar uma chave pública / privada, você pode usar esperar:

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

Você precisará substituir SRC e DEST por seus parâmetros normais de origem e destino de rsync e substituir PASS por sua senha. Apenas certifique-se de que este arquivo esteja armazenado com segurança!

Kainjow
fonte
3
esses comandos não estão disponíveis no meuRed Hat Enterprise Linux Server release 5.11 (Tikanga)
Para Kra
13

Eu tenho que trabalhar assim:

sshpass -p "password" rsync -ae "ssh -p remote_port_ssh" /local_dir  remote_user@remote_host:/remote_dir
andrey465
fonte
como seria remote_port_sshdefinido? Parece um espaço reservado para um valor real.
Max Williams
6

Use uma chave ssh.

Olhe para ssh-keygene ssh-copy-id.

Depois disso, você pode usar um rsyncdesta forma:

rsync -a --stats --progress --delete /home/path server:path
Guillaume Lebourgeois
fonte
Se eu usar a chave com ssh, escrevo: ssh u @ serv -i ./rsa Mas como fazer no rsync?
liysd
2
Se você colocar a chave em seu diretório .ssh e dar a ela um nome padrão (normalmente id_rsa / id_rsa.pub), ela será selecionada automaticamente pelo rsync.
Craig Trader de
6

Outra possibilidade interessante:

  1. gerar RSA ou par de chaves DSA (como foi descrito)
  2. coloque a chave pública no host (como já foi descrito)
  3. corre:
rsync --partial --progress --rsh = "ssh -i dsa_private_file" host_name @ host: / home / me / d.

Nota: -i dsa_private_file que é sua chave privada RSA / DSA

Basicamente, essa abordagem é muito semelhante à descrita por @Mad Scientist, porém você não precisa copiar sua chave privada para ~ / .ssh. Em outras palavras, é útil para tarefas ad-hoc (acesso único sem senha)

xhudik
fonte
5

O seguinte funciona para mim:

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

Eu tive que instalar sshpass

mario
fonte
2
-a já implica -rlptgoD e, em geral, seria muito mais útil ter uma linha de comando reduzida aqui.
Christian
4

É difícil inserir automaticamente a senha para o comando rsync. Minha solução simples para evitar o problema é montar a pasta para fazer o backup. Em seguida, use um comando rsync local para fazer backup da pasta montada.

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
fonte
3

Embora você já tenha implementado isso agora,

você também pode usar qualquer implementação esperada (você encontrará alternativas em Perl, Python: pexpect, paramiko, etc.)

João Figueiredo
fonte
2

Eu uso um arquivo VBScript para fazer isso na plataforma Windows, ele me serve muito bem.

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
fonte
2

A solução oficial (e outras) estava incompleta quando visitei pela primeira vez, então voltei, anos depois, para postar esta abordagem alternativa no caso de qualquer outra pessoa acabar aqui com a intenção de usar um par de chaves pública / privada:

Execute a partir da máquina de backup de destino, que puxa da origem para o backup de destino

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

Execute isso da máquina de origem, que envia o backup de origem para o destino

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

E, se você não estiver usando uma porta alternativa para ssh, considere os exemplos mais elegantes abaixo:

Execute a partir da máquina de backup de destino, que puxa da origem para o backup de destino:

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

Execute a partir da máquina de origem, que envia o backup de origem para o destino:

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

Se ainda for solicitada uma senha, você precisará verificar sua configuração de ssh /etc/ssh/sshd_confige verificar se os usuários na origem e no destino possuem a respectiva chave ssh pública dos outros enviando cada um com ssh-copy-id [email protected].

(Novamente, isso é para usar pares de chaves ssh sem uma senha, como uma abordagem alternativa, e não para passar a senha por meio de um arquivo.)

oemb1905
fonte
E uma observação importante é que, no exemplo da porta alternativa, você está direcionando o ssh para o seu arquivo de chave privada e, quando ele executa o comando no destino, ele se autentica em relação à sua chave pública.
oemb1905
-1

Seguindo a ideia postada por Andrew Seaford, isso é feito usando 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
lepe
fonte