Automação de Sincronização com Rsync e Expect no Linux

Em ambientes de gerenciamento de servidores Linux, comandos como sudo, ssh e ftp frequentemente requerem interação menual para inserção de senha. Para automatizar tarefas em scripts de shell, existem técnicas que permitem a passagem automática de credenciais.

Métodos para Inserção Automática de Senha

1. Utilizando Redirecionamento

Alguns comandos suportam parâmetros específicos para leitura de senha via entrada padrão. Por exemplo, o comando ftp aceita a flag -i para modo não interativo:

ftp -i -n 192.168.1.100 <<COMANDOS
user admin senha_segura
ls
COMANDOS

2. Através de Pipes

Comandos como sudo (com -S) e passwd (com --stdin) permitem receber senhas via pipe:

echo 'minha_senha' | sudo -S apt-get update

Para alteração de senha de usuário:

echo 'nova_senha' | passwd --stdin joao

3. Automação com Expect

Para comandos que não possuem parâmetros de leitura direta de senha, como o ssh, utiliza-se o expect. Esta ferramenta automatiza interações baseadas em padrões de resposta.

Instalação em distribuições baseadas em Debian/Ubuntu:

sudo apt-get install expect

Instalação via Homebrew em macOS:

brew install expect

Exemplo Prático: Sincronização com Rsync Autônoma

O script abaixo automatiza a sincronização de diretórios remotos usando rsync, tratando autenticação e possíveis prompts de confirmação:

#!/usr/bin/expect -f

set tempo_espera 30

if {$argc < 2} {
    puts stderr "Uso: $argv0 <caminho_remoto> <diretorio_local>"
    exit 1
}

set origem [lindex $argv 0]
set destino [lindex $argv 1]
set credencial "senha_aqui"
set tentativas_autenticacao 0

spawn rsync -avz --delete --exclude='*.tmp' $origem $destino

expect {
    -re "password:" {
        if {$tentativas_autenticacao == 1} {
            puts stderr "Falha na autenticação"
            exit 2
        }
        set tempo_espera 600
        incr tentativas_autenticacao
        send "$credencial\r"
        exp_continue
    }
    "yes/no" {
        send "yes\r"
        exp_continue
    }
    timeout {
        puts stderr "Tempo de conexão excedido"
        exit 3
    }
}

expect eof
exit 0

Configuração como Tarefa Agendada

Para execução periódica, adicione o script ao cron:

crontab -e

Insira uma entrada como:

0 2 * * * /usr/bin/expect /caminho/para/sync_script.exp usuario@servidor:/dados/remotos/ /backup/local/

Para execução manual:

expect /caminho/para/sync_script.exp root@192.168.1.100:/var/www/ /backup/www/

Nota: O script deve ser executado com o interpretador expect, não diretamente com bash. A primeira linha do arquivo indica o interpretante correto.

Tags: expect rsync Bash Automação servidores-linux

Publicado em 6-3 07:27 por Thomas