Respostas:
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.
ssh -i
sempre 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?
rsync -e
essh -i
.
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
sshpass -p`cat .password` ssh [...]
. Em seguida, proteja seu .password
arquivo chmod 400 .password
para garantir que apenas o usuário possa lê-lo.
src_path
deve ser server: path, assim:server01.mydomain.local:/path/to/folder
-a
a ativação do rsync inclui -rlptgoD
, você pode encurtar o comando desta forma:rsync -az ...
Você pode evitar o prompt de senha no rsync
comando, definindo a variável de ambiente RSYNC_PASSWORD
para a senha que você deseja usar ou usando a --password-file
opção.
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!
Red Hat Enterprise Linux Server release 5.11 (Tikanga)
Eu tenho que trabalhar assim:
sshpass -p "password" rsync -ae "ssh -p remote_port_ssh" /local_dir remote_user@remote_host:/remote_dir
remote_port_ssh
definido? Parece um espaço reservado para um valor real.
Use uma chave ssh.
Olhe para ssh-keygen
e ssh-copy-id
.
Depois disso, você pode usar um rsync
desta forma:
rsync -a --stats --progress --delete /home/path server:path
Outra possibilidade interessante:
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)
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
É 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
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.)
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 Name@192.168.1.100:/Users/Name/Projects/test ."
WScript.Sleep 100
shell.SendKeys"Your_Password"
shell.SendKeys "{ENTER}"
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' user@10.9.9.3:/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/ user@10.9.9.3:/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 user@10.9.9.3:/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/ user@10.9.9.3:/var/www/
Se ainda for solicitada uma senha, você precisará verificar sua configuração de ssh /etc/ssh/sshd_config
e 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 user@10.9.9.3
.
(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.)
Seguindo a ideia postada por Andrew Seaford, isso é feito usando sshfs:
echo "SuperHardToGuessPass:P" | sshfs -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@example.com:/mypath/ /mnt/source-tmp/ -o workaround=rename -o password_stdin
rsync -a /mnt/source-tmp/ /media/destination/
umount /mnt/source-tmp