I. Here Document para Entrada Automática
1. Conceito
O "Here Document" é uma forma de redirecionamento de entrada que fornece uma lista de comandos a um programa interativo. Ele funciona como uma substituição para a entrada padrão, permitindo que o script alimente dados a um comando diretamente, sem a necessidade de criar arquivos temporários.
2. Sintaxe
A estrutura básica utiliza um marcador delimitador:
comando <<DELIMITADOR
... conteúdo ...
DELIMITADOR
Regras importantes:
- O marcador pode ser qualquer string válida (comum usar
EOF). - O marcador final deve começar na primeira coluna da linha.
- Não deve haver caracteres após o marcador final.
- Espaços antes do marcador inicial são ignorados.
3. Exemplo com Conatgem de Caracteres
Uttilize um Here Document para fornecer texto ao comando tr e, em seguida, contar os caracteres resultantes:
tr -d '[:space:]' <<'TEXTO'
Isto é um exemplo
Com múltiplas linhas
E espaços em branco.
TEXTO | wc -c
4. Definindo uma Senha de Usuário
Crie uma senha para um usuário utilizando a entrada automática com o comando passwd:
passwd usuario_teste <<SENHA
novaSenha123
novaSenha123
SENHA
5. Gravando Conteúdo em Arquivo com Tee
O comando tee permite redirecionar a saída tanto para a tela quanto para um ou mais arquivos. Combine-o com um Here Document:
cat <<'CONFIG' | tee /tmp/configuracao.conf
opcao1=valor
opcao2=outro_valor
CONFIG
6. Substituição de Variáveis
Por padrão, variáveis são expandidas. Para tratar o conteúdo como uma string literal, coloque aspas no marcador inicial.
VERSAO="2.0"
echo <<EOF
Versão instalada: $VERSAO
EOF
echo <<'EOF'
Versão literal: $VERSAO
EOF
Utilize um traço (-) após << para remover tabulações iniciais de cada linha do conteúdo.
II. Expect para Automação Interativa
1. Finalidade
Expect é uma ferramenta construída sobre a linguagem Tcl, projetada para automatizar interações com programas que exigem entrada do usuário, como prompts de login ou senha.
2. Componentes Essenciais
Pré-requisitos: Verifique se os pacotes expect e tcl estão instalados.
which expect tcl
Interpretador: Um script Expect começa com a shebang correta.
#!/usr/bin/expect
spawn: Inicia um processo controlado pelo Expect.
expect: Espera por uma saída específica do processo. Suporta múltiplas correspondências.
expect {
"Senha:" { send "minhasenha\r" }
timeout { send_user "Tempo esgotado!\n"; exit 1 }
}
send: Envia uma string (simulando digitação) para o processo. Geralmente requer \r para simular Enter.
expect eof / interact: expect eof aguarda o término do processo. interact transfere o controle terminal de volta ao usuário.
set: Define variáveis, como o tempo limite.
set timeout 10
exp_continue: Permite que o bloco expect continue verificando após uma correspondência.
expect {
"(yes/no)" { send "yes\r"; exp_continue }
"password:" { send "senha123\r" }
}
send_user: Imprime mansagens para o terminal, similar ao echo.
Parâmetros: Acesse argumentos passados ao script.
set host_alvo [lindex $argv 0]
set usuario [lindex $argv 1]
III. Exemplos Práticos com Expect
1. Alterando Senha via Script
#!/usr/bin/expect
set usuario [lindex $argv 0]
set nova_senha [lindex $argv 1]
spawn passwd $usuario
expect "New password:"
send "$nova_senha\r"
expect "Retype new password:"
send "$nova_senha\r"
expect eof
2. Acesso SSH Automatizado
#!/usr/bin/expect
set servidor "exemplo.com"
set usuario "admin"
spawn ssh "$usuario@$servidor"
expect {
"continue connecting" { send "yes\r"; exp_continue }
"Password:" { send "senha_ssh\r" }
}
interact
3. Execução Incorporada em Shell
Integre comandos Expect dentro de um script Bash usando uma abordagem de script "aqui-documento" com o interpretador expect.
#!/bin/bash
NOVO_USUARIO="joao"
SENHA_TEMP="SenhaForte!123"
/usr/bin/expect <<EOD
spawn useradd $NOVO_USUARIO
expect eof
spawn passwd $NOVO_USUARIO
expect "New password:"
send "$SENHA_TEMP\r"
expect "Retype new password:"
send "$SENHA_TEMP\r"
expect eof
EOD
echo "Usuário $NOVO_USUARIO criado."
4. Automação de Particionamento
Combine as técnicas para automatizar o fdisk:
#!/usr/bin/expect -f
set disco "/dev/sdb"
spawn fdisk $disco
expect "Command"
send "n\r"
expect "Partition type"
send "p\r"
expect "partition number"
send "1\r"
expect "First sector"
send "\r"
expect "Last sector"
send "\r"
expect "Command"
send "w\r"
expect eof