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.