Automatize entradas para scripts Linux com o comando esperado

O comando expect do Linux permite automatizar as interações com scripts e programas. Você pode enviar qualquer tipo de resposta ao script quando ele estiver aguardando alguma entrada de texto.
Automação significa eficiência
Quando você administra um computador ou grupo de computadores Linux, você se depara com muitas tarefas repetitivas. A resposta óbvia é escrever um script para realizar a maior parte do trabalho para você. O shell Bash, como todos os shells modernos, oferece uma linguagem de script rica e flexível.
Criar um script de um trabalho enfadonho ou tedioso dá a você a flexibilidade de executar essa tarefa quando o escritório está fechado ou nos períodos mais silenciosos de uma operação 24 horas por dia, 7 dias por semana. Os scripts também oferecem repetibilidade. Eles não se esquecerão de realizar uma etapa, não importa quantas vezes sejam solicitados a realizar as mesmas tarefas chatas.
Tudo bem, até onde vai. Mas se o seu script requer interação do usuário, ou se chama um programa que precisará de entrada humana, o que você pode fazer? Você não quer ter que estar presente quando o script é executado ou, se estiver presente, observar a janela do terminal pronta para entrar e apertar algumas teclas.
O Linux tem o comando sim, que envia um fluxo de “ y ” caracteres ou qualquer outra string especificada pelo usuário para a janela do terminal. Se um programa estiver aguardando uma resposta a uma pergunta sim ou não, ele &’ será alimentado à força com um dos “ y ” personagens. Ele o aceitará como entrada e poderá prosseguir. Você precisa canalizar a saída de sim para o script.
sim | script. sh
Você pode não querer enviar uma resposta afirmativa. Talvez você precise dizer “ não. ” Você também pode fazer isso, usando o comando yes. Você pode enviar qualquer frase que desejar, você não está restrito a respostas como “ y ”, “ Y ”, “ Sim ”, “ n ”, “ N ” ou “ No. ”
Talvez você precise enviar um “ r ” para reinstalar em um “ instalar / atualizar / reinstalar [i / u / r] ” pronto.
sim r
O comando yes não pode ser resolvido se precisar fornecer mais de um tipo de resposta. Para essa situação, precisamos usar expect.
RELACIONADO: Como usar o comando yes no Linux
Instalando o comando esperado
Testamos o expect no Ubuntu, Fedora e Manjaro. O pacote não veio junto com essas distribuições, então teve que ser instalado. No Ubuntu, digite:
sudo apt install expect

No Fedora, o comando de que você precisa é:
instalação sudo dnf esperada

No Manjaro, usamos o pacman:
sudo pacman - Espera-se

Como espera funciona
O comando expect permite que você gerencie as duas pontas da conversa entre o seu conjunto de respostas preparadas e o programa ou script para o qual você as enviará. Você pode fazer isso criando um “ expect ” script que observa os prompts no script principal e envia a resposta apropriada para cada um.
Digamos que você tenha um script de backup que pede um nome de diretório de origem e um nome de diretório de destino. Em seguida, ele faz uma cópia dos arquivos do diretório de origem no diretório de destino. Sem os bits que copiam o arquivo, seu script pode ter a seguinte aparência:
#! / bin / bash echo "Diretório para fazer backup?" ler source_directory echo "Local do backup?" ler target_directory echo echo "Diretório de destino:" $ target_directory
Tudo o que esse script faz é pedir os caminhos para os dois diretórios. Ele imprime o diretório de destino na janela do terminal para que possamos ver que recebeu uma resposta de espera e que pode lê-la corretamente.
Para fornecer a outra metade da conversa, criamos um “ script de espera. ” Por convenção, eles têm um “ . exp ” extensão. Este exemplo funcionará com nosso “ backup. sh ” script.
#! / usr / bin / expect -f set timeout -1 spawn ./backup. sh expect "Directory to backup? \ r" send - "/ home / dave / Documentos / \ r "esperar" Local do backup? \ r "enviar -" / media / dave / externo / backup \ r "esperar eof
Isso mostra os três comandos principais em scripts expect, os comandos spawn, expect e send.
A primeira coisa a notar é que o shebang está se referindo a esperar, não a bash. O sinalizador -f (arquivo) informa a expectativa de que as respostas venham de um arquivo.
Nós efetivamente desativamos os tempos limites configurando-os para infinito com -1.
O comando spawn inicia o script de backup.
Conhecemos as duas perguntas que o “ backup. sh ” o script vai nos perguntar. Para cada pergunta, criamos um “ esperar ” linha. Eles contêm o prompt de texto que será enviado para a janela do terminal pelo “ backup. sh ” roteiro. Isso é o que o programa de espera deve estar atento. Quando expect vê o prompt, o texto na linha de envio é retornado para o arquivo “ backup. sh ” script.
As linhas esperadas do eof informam esperar pelo fim do arquivo final na conclusão do processamento no script automatizado.
Torne os dois scripts executáveis:
chmod + x backup. sh
chmod + x backup. exp

E use o “ backup. exp ” script para iniciar todo o processo.
./ backup. exp

Você pode ver os dois prompts de “ backup. sh ” e as respostas de “ backup. exp. ”
Isso vai ficar Fiddly Fast
É ótimo ver dois scripts interagindo assim, com as respostas automatizadas sendo enviadas pelo nosso script esperado e sendo aceitas como uma entrada genuína pelo script automático. Este é apenas um exemplo simples, é claro. Se você tentar automatizar um processo demorado — e eles são aqueles que você &’ deseja automatizar — você logo ficará atolado.
O texto nas linhas esperadas deve corresponder exatamente aos prompts do script que você está automatizando. Erros ortográficos e palavras incorretas farão com que um prompt seja ignorado e o processo automatizado parará. Se você ainda estiver desenvolvendo ou ajustando o script que está tentando automatizar, o texto dos prompts e sua ordem no script provavelmente serão alterados. As atualizações de scripts ou programas podem alterar, remover ou introduzir prompts. Manter o controle das mudanças e replicá-las em seu script esperado torna-se cansativo e sujeito a erros.
A maneira mais conveniente de criar um script expect é usar autoexpect. Isso é instalado junto com o expect. Podemos dizer ao autoexpect para monitorar nossa interação na vida real com um script ou programa e gerar um arquivo esperado para nós.
Pode haver alguma arrumação a ser feita no arquivo esperado gerado, mas é muito mais rápido do que escrever um à mão. Por exemplo, se você digitar algo errado em sua sessão quando o autoexpect estiver monitorando você, os pressionamentos de tecla incorretos e sua edição e retrocesso para corrigi-los serão todos capturados. Para arrumar isso, simplesmente exclua essa seção e digite o texto correto.
Usando autoexpect
Usar autoexpect é fácil. Usamos o sinalizador -f (nome do arquivo) para informar o nome do arquivo esperado que ele deve criar e o programa ou script que queremos executar. Os prompts do processo e nossas respostas são registrados e enviados para o arquivo expect. Como um toque legal, o autoexpect torna o arquivo esperado executável para nós.
Digamos que usemos com frequência o rsync para enviar arquivos de um computador para um diretório em outro computador pela rede. Usaremos autoexpect para criar um arquivo esperado desse processo.
Nossa linha de comando tem esta aparência. O primeiro comando é autoexpect seguido pelo sinalizador -f e o nome do arquivo expect que queremos criar. Nesse caso, é “ send-pics. exp. ”
O resto do comando é o comando rsync regular. Como o rsync usa o protocolo SSH para se conectar remotamente ao computador de destino, precisaremos fornecer a senha para a conta do usuário “ dave ” no computador de destino.
autoexpect -f send-pics. exp rsync -rasv ~ / Pictures / raw / dave@nostromo. local: / home / dave / raw /

Quando executamos esse comando, o rsync é iniciado e é solicitada a senha da conta do usuário dave no computador remoto. Depois que isso é inserido, alguns arquivos são enviados para o computador remoto, o rsync interrompe a conexão e o processo é encerrado.

Fomos informados de que o arquivo “ send-pics. exp ” foi criado. Vamos dar uma olhada:
ls -l send-pics. exp

Ele realmente foi criado e é executável. Podemos executá-lo chamando-o pelo nome:
./ send-pics. exp

Desta vez, o processo é executado sem nenhuma interação humana. Todos os novos arquivos desde a última transferência são enviados para a máquina remota.
Este é um pequeno exemplo de script. Quase não economiza esforço em comparação com a execução do comando rsync manualmente. Embora isso seja verdade, ilustra o fato de que você pode controlar programas, bem como scripts, e pode aplicar os princípios vistos aqui a scripts ou processos de qualquer tamanho.
RELACIONADO: Como fazer backup do seu sistema Linux
Espera aí, minha senha!
Você precisa estar ciente de que quaisquer senhas — ou qualquer outra informação sensível — coletada durante uma sessão de autoexpect são armazenadas em texto simples no script expect gerado. As senhas nunca devem ser escritas em texto simples em qualquer lugar. Para conexões SSH, uma solução melhor é usar chaves SSH e ter um esquema de autenticação sem senha.
Obviamente, isso não vai ajudar se você não estiver usando SSH.

Você pode editar seu script esperado e alterar a linha que trata de sua senha para:
interagir ++ retorno

Quando o script atingir esta linha, ele aguardará sua entrada, permitindo que você insira sua senha. O controle retorna ao script esperado assim que você fornecer sua senha.
./ send-pics. exp

Mas isso apresenta um problema diferente. Isso significa que seu script não pode mais ser executado sem supervisão. Se você sempre iniciará manualmente o seu script, isso provavelmente não fará diferença, especialmente se a solicitação de senha ocorrer logo no início do script. Você pode iniciar o script, inserir sua senha e deixar que ele cuide de si mesmo.
Outra maneira de resolver o problema é:
- Altere as permissões de arquivo em seu script expect usando chown para 740, -rwxr-x ---.
- Use chmod para alterar o proprietário do grupo do script expect para um grupo confiável.
- Crie um script regular que inicie seu script esperado. Defina este arquivo como propriedade do grupo confiável também. Defina as permissões para 2751, -rwxr-s - x.
- Isso cria um script de inicialização que qualquer pessoa pode ler e executar, que está no mesmo grupo confiável que o script expect, e com seu setgid bit set. Independentemente de quem executa este script, seu grupo efetivo será o grupo confiável e não o grupo da pessoa que executa o script. Portanto, este script sempre será capaz de iniciar o script expect.
- Enquanto isso, o script expect que contém a senha está inacessível para qualquer pessoa, exceto você.
RELACIONADO: Como usar SUID, SGID e Sticky Bits no Linux
Você pode esperar grandes coisas
Há o suficiente aqui para você começar, mas há muito mais a se esperar do que as áreas que cobrimos. A página de manual esperada tem mais de 1700 linhas!
Para tarefas como instalações automatizadas, backups agendados ou implantações repetitivas, espere transformará seu fluxo de trabalho.
Nenhum comentário