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)
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
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
}
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
MONITORANDO UMA REDE E AVISANDO AO ADMINISTRADOR
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.
EXEMPLO -
#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
#!/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.