Arquivos históricos do BR-Linux.org apresenta:

Linux in Brazil (Expect )

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)


O Arquivo Histórico do BR-Linux.org mantém no ar (sem alteração, exceto quanto à formatação) notícias, artigos e outros textos publicados originalmente no site na segunda metade da década de 1990 e na primeira década do século XXI, que contam parte considerável a história do Linux e do Open Source no Brasil. Exceto quando indicado em contrário, a autoria dos textos é de Augusto Campos, e os termos de uso podem ser consultados na capa do BR-Linux.org. Considerando seu caráter histórico, é provável que boa parte dos links estejam quebrados, e que as informações deste texto estejam desatualizadas.