Expect

Linux in Brazil

Documentação original
e de qualidade
em bom português

O texto abaixo foi publicado no BR-Linux antes de 2005, e está mantido aqui por razões históricas. Veja o material atualizado diariamente do BR-Linux em http://br-linux.org
Dúvidas comuns | Perguntar no Fórum | Notícias | Mais documentos | Contato
 
Destaques de hoje:
  • Abundam as análises do Chromium, navegador web open source do Google
  • A semana no BR-Linux: Reiser condenado, Firefox 3.1 mais rápido, pedal de guitarra open source
  • Resultado da promoção da camiseta "Nerdômetro" da Red Bug - brinde pra todo mundo!
  • Último dia para enviar sua foto e concorrer às camisetas "Nerdômetro"
  • A FERRAMENTA DE PROGRAMAÇÃO EXPECT

    por João Alexandre Lôbo Marques (alexandre@prce.mpf.gov.br)

    Nota do editor: embora o autor tenha baseado sua pesquisa na distribuição de Linux da Conectiva, o expect é uma ferramenta disponível por padrão na maior parte das distribuições.


    Se você trabalha com scripts e tem a necessidade de desenvolver rotinas em linguagens de scritp que estabeleçam comunicação entre servidores, EXPECT é uma ferramenta que poderá lhe ajudar e muito. Em primeiro lugar porque é uma ferramenta que torna simples procedimentos difíceis de serem implementados remotamente, tais como automatizar telnet, rlogin ou fsck. Em segundo lugar porque é simples e já vem junto com o Conectiva LINUX.

    Dando uma definição mais formal, EXPECT é uma ferramenta para automatizar aplicações que exijam alguma interatividade entre máquinas clientes e servidoras, podendo ser citadas diversas dessas aplicações tais como telnet, ftp, passwd, fsck, rlogin, tip, etc. A ferramenta EXPECT realmente transforma esta tarefa em algo simples e trivial, além de também poder ser utilizada para testar estes mesmos tipos de aplicação. E outro aspecto muito interessante é que com a adição da ferramenta Tk, podem ser desenvolvidas aplicações para rodar em interfaces gráficas (GUI) X11.

    O site oficial EXPECT ( The Expect Home Page) é um excelente ponto de partida para conhecer melhor como funciona a ferramenta. Apesar de não ser uma tradução pura e simples, baseamos este trabalho neste site para trazer para nossa língua portuguesa informações sobre mais esta ferramenta.

    Podem ser encontradas diversas fontes de documentação para ajudar um usuário interessado em trabalhar com a EXPECT. A seguir está uma lista de tópicos interessantes:

    Você poderá pegar o EXPECT além dos exemplos no próprio site oficial expect.nist.gov. O download poderá ser feito nos formatos expect.tar.Z ou expect.tar.gz. O arquivo gz é mais simples de se trabalhar e seu download é mais rápido. No entanto, se você preferir, há também a versão Z da distribuição. Dependendo da escolha, na linha de comando, digite:

    
    

    uncompress expect.tar.Z tar -xvf expect.tar

    ou

    
    

    tar -xzvf expect.tar.gz

    Isto criará um diretório contendo a distribuição do EXPECT. Entre neste diretório e siga as instalação do arquivo README.

    ATENÇÃO: O EXPECT requer que já esteja instalada no sistema a ferramenta Tcl. Se você ainda não possui o Tcl instalado, você poderá baixá-lo a partir dos links tcl.tar.Z or gz no site oficial. Para instalar, descompacte e siga as instruções do arquivo README, da mesma forma que com o EXPECT.

    Outros itens interessantes do site oficial são:

    * Exploring Expect é um livro da O'Reilly que serve como excelente fonte para o uso do Expect. Possui centenas de exemplos e também inclui um tutorial sobre o Tcl

    * Expect FAQ (Frequently Asked Questions List) - Este FAQ é bastante interessante e traz informações gerais e dados técnicos sobre o uso do EXPECT.

    * Lista de exemplos que vem com o próprio Expect - Esta é uma simples lista. Existem exemplos mais atualizados que podem ser obtidos fazendo-se o download da distribuição completa do EXPECT. No entanto, esta lista é bastante útil para o usuário sentir o poder de fogo do EXPECT e ver na prática como ele realmente simplifica tarefas.

    * Arquivo EXPECT - Aqui você encontra scripts gerais de contribuição voluntária

    * The Expect README - Este é o próprio arquivo de README que vem com a instalação do EXPECT. O README tem diversas informações que podem ser bastante úteis. A princípio, há uma descrição da distribuição do software, tudo sobre bug reports, suporte, e outrs informações.

    * História do desenvolvimento do EXPECT e diferenças entre versões. A versão atual do EXPECT (segundo o site expect.nist.gov até a publicação deste arquivo é a 5.31.5, criada em 06/03/2000 - Mon Mar 06 10:35:04 EST 2000.

    * Links para informações relacionadas ao EXPECT

    * Além disso, não deixe de olhar a "man page" do EXPECT (man expect)

    CARACTERÍSTICAS DO EXPECT

    A melhor forma de aprendermos uma linguagem é realmente trabalharmos com ela na prática. Por isso, não será dada uma lista de todos os comandos com suas funções e parâmetros. Isto pode ser encontrado com um pouco de pesquisa nas páginas de manual do EXPECT ou nos sites indicados.

    Será feita uma breve apresentação dos principais comandos e características e em seguida partiremos logo para alguns exemplos no intuito de dar uma visão geral desta ferramenta de programação.

    Iniciando uma apresentação da linguagem temos que a primeira linha de um script deve ser sempre a mostrada logo a seguir:

    #!/caminho/para/expect -f

    No caso do meu sistema Conectiva LINUX 4.0 está em " #!/usr/bin/expect -f ". Você poderá localizar onde está o interpretador do seu EXPECT através do comando:

    $find / -name expect

    Esta primeira chamada indica onde está o interpretador do EXPECT e o ativa para verificar e executar o que está contido no arquivo do script em questão.

    I - A atribuição de valores a variáveis segue o padrão de outras linguagens de script para shell, utilizando o comando "set":

    set valor

    II - Da mesma forma que nas linguagens Perl ou PHP, a referência a uma variável deve sempre ser precedida do caractere "$".

    III - O comando para executar um programa no shell atual é o "spawn"

    IV - O comando para enviar uma mensagem para a tela do usuário é o "send_user"

    V- Para enviar um pacote com uma string ou comando utiliza-se o "send"

    VI- Existem rotinas de teste de "timeout" de finalização e de erro inerentes ao sistema. Isto quer dizer que pode-se fazer referência por exemplo a um erro padrão ocorrido apenas referenciando-se no código com a adição da cláusula:

    
    

    erro

    {

    código de tratamento

    }

    EXEMPLO -

    EXECUTANDO UM COMANDO EM SEGUIDA AO SU

    Este é um programa que visa automatizar um comando após o usuário entrar em uma seção "su". Pode ser utilizado por exemplo para listar o diretório automaticamente.

    O script se chamará "su2" e o comando desejado deve ser passado como parâmetro na linha de comando. Assim, para o exemplo de listagem de diretório, o comando a ser dado deverá ser:

    $su2 ls

    A listagem do script com diversos comentários está a seguir:

    #!/usr/bin/expect -f
    #Lembre que a primeir linha sempre deverá referenciar o interpretador expect
    set timeout -1
    log_user 0 ;# Faz com que o programa não esteja em modo de login do usuário
    spawn su ;# Executa o comando su
    system stty -echo ;# Prepara para receber a senha do usuário. Desabilita o echo do teclado
    send_user "Password: " ; #Mostra ao usuário a string
    expect_user -re "(.*)\n" ;#Recebe a digitação da senha
    set password $expect_out(1,string) ;# Coloca na variável $password o valor digitado pelo usuário
    system stty echo ;# Retorna o echo de caractere
    expect "*Password:" ;# Apaga o prompt de requisição de senha
    log_user 1 ;# Faz com que o programa entre em modo de login do usuário
    send "$password\r" ;# Envia a variável $password
    expect *Sorry* exit *#* ;# Trata algum erro que possa acontecer e sai do programa
    eval send [lrange $argv 1 end] \\r ;# Envia o argumento passado para ser executado
    interact ;# Permite que o usuário interaja com o novo shell e envie novos comandos

    EXEMPLO

    MONITORANDO UMA REDE E AVISANDO AO ADMINISTRADOR


    #!/usr/bin/expect -f
    # Este script executa o comando ping para uma lista prévia de hosts
    # Se algum estiver down, envia um PAGER para o administrador do sistema
    # Atenção: Este exemplo poderá ter que ser ajustado ao sistema de pager utilizado.
    # Deverá funcionar facilmente. No entanto, caso haja problemas
    # podem ser encontradas informações adicionais com scripts específicos para pagers
    # no próprio site de Archive do Expect (expect.nist.gov)
    #############################
    # Executar ping para cada host
    # #############################
    foreach host $argv
    {
    spawn ping $host ;# Executa o ping para o host em questão

    set timeout 2 ;# Determina um timeout de 2 segundos
    expect "alive" ;# Testa se recebeu resposta
    {
    continue ;# Se sim, continua o loop "foreach"
    }
    timeout ;# Rotina de tratamento do timeout
    {
    lappend deadhosts $host ;# Grava o host que não respondeu
    }
    close wait
    }
    ##########################
    # Envia Mensagem via Pager
    # ##########################
    if [info exists deadhosts] ;# Testa se algo foi gravado em "deadhosts" na rotina de timeout acima.
    {
    spawn tip modem ;# Executa o programa tip
    expect "connected"
    send "ATD1234567\r" ;# Envia a string de discagem
    expect "user:"
    send "user123\r" ;# Envia o nome do usuário
    expect "msg:"
    send "not responding to ping: $deadhosts\r" ;# Envia a mensagem informando o(s) host(s) fora do ar
    expect eof
    }

    CONCLUSÃO


    A idéia deste artigo foi apresentar o EXPECT de uma maneira simples e direta para quem nunca tinha ouvido falar nele (como eu mesmo há algum tempo atrás) e estava com esta potente ferramenta embaixo do nariz, assim como também para dar uma visão prática para aqueles que já haviam ouvido falar mas não tinham começado a criar aplicações para seu sistema.
    Conforme já foi dito, o EXPECT realmente é uma ferramenta que pode ser bastante útil caso você seja um administrador de sistemas que se trabalhe com diversos servidores, ou mesmo que necessite automatizar tarefas (e qual administrador não precisa?).
    Especificamente no meu caso, implementei diversas rotinas, tais como login remoto, telnet e outras aplicações que perdi muito tempo buscando soluções sem sucesso. Boa sorte para os felizardos que partirem para trabalhar neste time.

    por João Alexandre Lôbo Marques (alexandre@prce.mpf.gov.br)