Como outros já disseram, você pode fazer isso com chaves ssh sem senha. Isso é inerentemente inseguro e você precisa executar etapas adicionais para adicionar alguma segurança ao processo. O que eu faço é restringir o uso da chave para um host e um comando . Eu escrevi isso em minhas anotações, acho que não perdi nenhuma saída.
A primeira coisa a fazer é gerar um par de chaves públicas que será usado apenas para esse processo de backup. Quando for solicitada uma frase secreta, basta pressionar enter duas vezes.
ssh-keygen -t rsa -b 2048 -C "For Backup use only"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/root/.ssh/id_rsa): /root/.ssh/backup.id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/backup.id_rsa.
Your public key has been saved in /root/.ssh/backup.id_rsa.pub.
The key fingerprint is:65:c0:cb:2b:9e:18:ff:b2:59:d4:b5:e8:ae:84:32:2b
Transfira a chave pública /root/.ssh/backup.id_rsa.pub
para o host remoto e adicione-a ao arquivo /root/.ssh/authorized_keys
.
No host remoto, restrinja o uso da chave pública adicionando from=
e command=
restrições. Edite o arquivo /root/.ssh/authorized_keys
, localize a chave de backup e adicione o endereço / nome do host que executará a tarefa cron, bem como um comando a ser executado. Esse comando será executado quando algo fizer login com essa chave, por exemplo,
from="192.168.254.207",command="/root/checkrsync",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3N...
Você só pode usar essa chave em 192.168.254.207 e só pode executar o comando / root / checkrsync e outras funcionalidades foram removidas também.
Edite o arquivo / root / checkrsync como este
echo $SSH_ORIGINAL_COMMND >/tmp/rsync.cmd
salve e torne-o executável
chmod 700 /root/checkrsync
Alteraremos /root/checkrsync
mais tarde, quando soubermos o que é $ SSH_ORIGINAL_COMMAND.
No host em que estaremos executando o cron job, execute o comando rsync de forma interativa
/usr/bin/rsync -avz -e "/usr/bin/ssh -i /root/.ssh/backup.id_rsa" /source_folder [email protected]:/destination_folder
Não se preocupe com mensagens de erro que queremos apenas gerar o arquivo /tmp/rsync.cmd no host remoto
No host remoto, faça uma anotação exata do conteúdo do arquivo /tmp/rsync.cmd (será algo como rsync --server -vlogDtprze.iLs . /destination_folder
).
Na edição do host remoto /root/checkrsync
e altere para
if [[ "$SSH_ORIGINAL_COMMAND" == "rsync --server -vlogDtprze.iLs . /destination_folder" ]]
then
$SSH_ORIGINAL_COMMAND
fi
onde o lado direito da instrução if é o que estava em /tmp/rsync.cmd.
Teste a configuração. No host em que estaremos executando o cron job, execute o comando rsync de forma interativa novamente
/usr/bin/rsync -avz -e "/usr/bin/ssh -i /root/.ssh/backup.id_rsa" /source_folder [email protected]:/destination_folder
Agora ele deve ser executado corretamente se for instalado no seu crontab.
crontab -e
* 1 * * * /usr/bin/rsync -avz -e "/usr/bin/ssh -i /root/.ssh/backup.id_rsa" /source_folder [email protected]:/destination_folder