Automatize entradas para scripts Linux com o comando wait

Conteúdo

Bash Shell

O comando de espera do Linux permite que você automatize as interações com scripts e programas. Você pode enviar qualquer tipo de resposta ao script quando ele estiver esperando alguma entrada de texto.

Automação significa eficiência

Quando você gerencia um computador Linux ou um grupo de computadores, você encontrará muitas tarefas repetitivas. A solução óbvia é escrever um script para fazer a maior parte do trabalho para você.. O shell bash, como todas as conchas modernas, Fornece uma linguagem de script rica e flexível.

O script de um trabalho tedioso ou tedioso oferece a flexibilidade de executar essa tarefa quando o escritório está fechado ou durante os períodos mais silenciosos de uma operação. 24 horas do dia, a 7 dias da semana. Os scripts também oferecem repetibilidade. Eles não vão se esquecer de dar um passo, não importa quantas vezes eles sejam solicitados a fazer as mesmas tarefas chatas.

Isso está bem, o mais longe possível. Mas se o seu script precisa de interação do usuário, ou se você ligar para um programa que precisará da participação humana, que pode fazer? Você não quer ter que se apresentar quando o script for executado, ou se você estiver presente, esteja olhando para a janela do terminal pronto para entrar e pressione algumas teclas.

Linux tem o yes comando, que envia uma sequência de caracteres “e” ou qualquer outra string especificada pelo usuário para a janela do terminal. Se um programa está esperando por uma resposta a uma pergunta sim ou não, um dos personagens será forçado “e”. Você o aceitará como entrada e poderá continuar. Você precisa canalizar a saída de yes no 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 yes comando. Você pode enviar a frase que quiser, você não está restrito a respostas como “e”, “E”, “sim”, “n”, “N” o “Não”.

Talvez você precise enviar um “r” para reinstalar um “install/upgrade/reinstall [i/u/r] ” agora mesmo.

sim r

a yes O comando não pode ser resolvido se você precisar fornecer mais de um tipo de resposta. Para aquela situação, precisamos usar expect .

RELACIONADO: Como usar o comando yes no Linux

Aguarde a instalação do comando

Nós testamos expect no Ubuntu, Fedora e Manjaro. O pacote não foi incluído com essas distribuições, então ele teve que resolver. Escrever no Ubuntu:

sudo apt instalar esperar

No Fedora, o comando que você precisa é:

sudo dnf install expect

Em Manjaro usamos pacman:

sudo pacman -Sy esperar

Como espera?

a expect O comando permite-lhe gerir os dois extremos da conversa entre o seu conjunto de respostas preparadas e o programa ou script para o qual as enviará. Para isto, cria um script “Esperado” que procura direções no script principal e envia a solução certa para cada.

Suponha que você tenha um script de backup que solicita um nome de diretório de origem e um nome de diretório de destino. A seguir, faz uma cópia dos arquivos no diretório de origem para o diretório de destino. Sem os bits que copiam o arquivo, seu roteiro pode se parecer com isso:

#!/bin/bash

echo "Diretório para backup?"
read source_directory

echo "Localização de backup?"
read target_directory

echo
echo "Diretório alvo:" $target_directory

tudo o que este script faz é pedir os caminhos para os dois diretórios. Imprima o diretório de destino na janela do terminal para que possamos ver que você recebeu uma resposta de expect e que eu poderia lê-lo corretamente.

Para fornecer a outra metade da conversa, criamos um “roteiro esperado”. Por convenção, estes têm uma extensão “.Exp”. Este exemplo funcionará com nosso script “backup.sh”.

#!/usr/bin/expect -f

set timeout -1

spawn ./backup.sh

expect "Diretório para backup?r"
Enviar -- "/home / dave / Documentos / r"

Espero "Localização de backup?r"
Enviar -- "/media / dave / externo / backupr"

esperar eof

Isso mostra os três comandos principais nos scripts de espera, a spawn, expect, e send comandos.

Primeira coisa a notar é o galpão se refere a expect, Não a bash. a -f (Arquivo) a bandeira diz expect as respostas vêm de um arquivo.

efetivamente, desabilitamos os tempos limite configurando-os para o infinito com -1.

a spawn comando lança script de backup.

Sabemos as duas perguntas que o script "backup.sh" nos fará.. Para cada pergunta criamos uma linha de “Esperar”. estes contêm a mensagem de texto que será enviada para a janela do terminal através do script “backup.sh”. Isto é o que expect o programa estará atento. Quando expect veja a mensagem, o texto no send A linha é devolvida ao roteiro “backup.sh”.

a expect eof as linhas dizem expect esperar pelo fim do arquivo final após a conclusão do processamento no script automatizado.

Torne ambos os scripts executáveis:

chmod + x backup.sh
chmod + x backup.exp

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

./backup.exp

Você pode ver as duas indicações de “backup.sh” e as respostas de “backup.exp”.

Isso vai ficar muito rápido

É legal ver dois scripts interagindo assim, com as respostas automáticas enviadas por nosso script de espera e aceitas como entrada genuína pelo script automatizado. Este é apenas um exemplo simples, decididamente. Se você está tentando automatizar um longo procedimento, e são eles que você deseja automatizar, logo ficará preso.

O texto no expect as linhas devem corresponder exatamente aos prompts do script que você está automatizando. Erros de ortografia e palavras incorretas farão com que uma mensagem seja ignorada e o procedimento automatizado será interrompido. Se você ainda está desenvolvendo ou modificando o script, está tentando automatizar, o texto dos prompts e sua ordem no script podem mudar. As atualizações do script ou do programa podem mudar, remover ou inserir mensagens. Acompanhar as mudanças e replicá-las em seu script esperado torna-se tedioso e sujeito a erros.

A maneira mais conveniente de criar um script de espera é usar autoexpect. Isso é instalado junto com expect. Podemos dizer autoexpect para monitorar nossa interação na vida real com um script ou programa, e gerar um arquivo de espera para nós.

Algum trabalho pode precisar ser feito no arquivo de espera gerado, mas é muito mais rápido do que escrever à mão. Como um exemplo, se você errar a ortografia de algo em sua sessão quando o autoexpect está monitorando, pressionamentos de tecla incorretos serão capturados e sua edição e backspace para corrigi-los. Para consertar isso, apenas apague essa seção e escreva o texto correto.

Usando autoexpect

Usando autoexpect é facil. Nós usamos o -f (nome do arquivo) para indicar o nome do arquivo esperado para criar e o programa ou script que queremos executar. As instruções de procedimento e nossas respostas são registradas e enviadas para o arquivo de retenção. Como um belo toque, autoexpect torna o arquivo de espera executável para nós.

Digamos que costumamos usar rsync enviar arquivos de um computador para um diretório em outro computador via rede. Usaremos autoexpect para criar um arquivo de espera para esse procedimento.

Nossa linha de comando se parece com isto. O primeiro comando é autoexpect Seguido por -f sinalizador e o nome do arquivo de espera que queremos criar. Nesta circunstância, isto é “send-pics.exp”.

O resto do comando é o regular rsync comando. Devido a que rsync use o SSH protocolo para conectar remotamente ao computador de destino, vamos precisar fornecer a senha para a conta de usuário “Dave” no computador alvo.

autoexpect -f send-pics.exp rsync -rasv ~ / Pictures / raw / [email protected]:/home / dave / raw /

Quando executamos esse comando rsync ele inicia e é solicitada a senha da conta de usuário dave no computador remoto. Depois de entrar, alguns arquivos são enviados para o computador remoto, rsync quebra a conexão e o procedimento termina.

Fomos informados de que o arquivo foi criado “send-pics.exp”. Vamos a ver:

ls -l send-pics.exp

Na realidade, foi criado e é executável. Podemos executá-lo chamando-o pelo nome:

./send-pics.exp

Desta vez, o procedimento é executado sem qualquer 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 rsync comando de mão. Embora isso seja verdade, ilustra o fato de que pode controlar programas e scripts, e você pode aplicar os princípios vistos aqui a scripts ou processos de qualquer comprimento.

RELACIONADO: Como fazer backup do seu sistema Linux

Esperando, Minha senha!

Você deve prestar atenção que qualquer senha, ou qualquer outra informação confidencial, coletado durante um autoexpect A sessão é armazenada em texto simples no script de espera 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 tem um esquema de autenticação sem senha.

Evidentemente, isso não vai ajudar se você não estiver usando SSH.

Senha armazenada em texto simples no script de espera, no editor gedit

Você pode editar seu script de espera e alterar a linha que trata de sua senha para:

interagir ++ Retorna

Comando interativo no script de espera, no editor gedit

Quando o script chega a esta linha, vai esperar por sua entrada, que permitirá que você insira sua senha. O controle posteriormente retorna ao script esperado, uma vez que você forneceu sua senha.

./send-pics.exp

Mas isso apresenta um obstáculo diferente. Isso significa que seu script não pode mais ser aberto sem supervisão. Se você sempre iniciará manualmente o seu script, provavelmente não importa, especialmente se a solicitação de senha acontecer logo no início do script. Você pode iniciar o script, digite sua senha e deixe-a cuidar de si mesma.

Outra maneira de abordar o problema é:

  • Alterar permissões de arquivo em seu script esperado usando chown al 740, -rwxr-x---.
  • Usar chmod para mudar o proprietário do grupo do script de espera para um grupo confiável.
  • Crie um script regular que inicie o script esperado. Configure este arquivo para pertencer também ao grupo de confiança. Defina as permissões neste em 2751, -rwxr-s--x.
  • Isso cria um script de inicialização que qualquer pessoa pode ler e executar, que está no mesmo grupo de confiança que o script de espera, e com o dele setgid conjunto de bits. 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. Por isso, este script sempre será capaz de executar o script de espera.
  • Entretanto, o script de espera contendo a senha está inacessível para qualquer pessoa, exceto você.

RELACIONADO: Como usar SUID, SGID e Sticky Bits em Linux

Você pode esperar grandes coisas

Aqui está o suficiente para você começar, mas há muito mais para expect que as áreas que cobrimos. a expect A página do manual tem mais de 1700 linhas!

Para tarefas como instalações automatizadas, backups programados ou implantações repetitivas, a espera irá transformar o seu fluxo de trabalho.

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.