﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Pensamientos de otro más &#187; autoexpect</title>
	<atom:link href="http://www.superjueves.net/pensamientosdeotromas/tag/autoexpect/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.superjueves.net/pensamientosdeotromas</link>
	<description>Sitio sobre Agilidad, desarrollo de software, programación, etc</description>
	<lastBuildDate>Tue, 24 Jul 2018 19:15:07 +0000</lastBuildDate>
	<language>es-ES</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.8.41</generator>
	<item>
		<title>Automatiza todo lo que puedas con Expect</title>
		<link>http://www.superjueves.net/pensamientosdeotromas/2011/07/18/automatiza-todo-lo-que-puedas-con-expect/</link>
		<comments>http://www.superjueves.net/pensamientosdeotromas/2011/07/18/automatiza-todo-lo-que-puedas-con-expect/#comments</comments>
		<pubDate>Mon, 18 Jul 2011 19:34:38 +0000</pubDate>
		<dc:creator><![CDATA[Alvaro García Loaisa]]></dc:creator>
				<category><![CDATA[Productividad]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[autoexpect]]></category>
		<category><![CDATA[automatizar]]></category>
		<category><![CDATA[codigo]]></category>
		<category><![CDATA[expect]]></category>

		<guid isPermaLink="false">http://www.superjueves.net/pensamientosdeotromas/?p=167</guid>
		<description><![CDATA[Muchas veces nos toca hacer tareas repetitivas una y otra vez que nos quitan mucho tiempo. Normalmente no las damos la mayor importancia, ya que estamos acostumbrados a hacerlas y nos salen casi sin pensar. Desde un simple ssh o una copia de backup, hasta un despliegue de la aplicación a producción. Este tipo de [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter size-full wp-image-155" title="entrenamiento" src="http://www.superjueves.net/pensamientosdeotromas/wp-content/uploads/2011/07/automatiza.jpg" alt="" width="235" height="175" /></p>
<div>
<p>Muchas veces nos toca hacer tareas repetitivas una y otra vez que nos quitan mucho tiempo. Normalmente no las damos la mayor importancia, ya que estamos acostumbrados a hacerlas y nos salen casi sin pensar. Desde un simple ssh o una copia de backup, hasta un despliegue de la aplicación a producción.</p>
<p>Este tipo de tarea son subceptibles a fallos, ya que estamos tan habituados a ellas, que las hacemos sin pensar. ¿Cuántas veces has cometido fallos al hacerlas? ¿cuántas veces has puesto mal el nombre de la máquina a la que te vas a conectar, has metido mal la password, o incluso hasta te has cargado algo por un error tonto? Yo multitud de ellas.</p>
<p>Una de las mejores cosas que tiene la informática, es que podemos automatizar las tareas para ahorrarnos un tiempo valiosísimo y evitar esta serie de errores tontos, pero que pueden ser garrafales.</p>
<p>Hoy voy a intentan enseñaros una herramienta simple para automatizar estas tareas, llamada <a href="http://expect.sourceforge.net/">Expect</a>.</p>
<p>Me diréis, “¿por qué nos cuentas esto? create un programa en bash o en cualquier lenguaje y ala!” Pero hay muchas veces que tenemos que pegarnos contra una interfaz interactiva, a la cual tenemos que contestar y esperar a que nos conteste, por eso solemos hacer estas tareas a mano. Bien, pues con Expect podemos interactuar con la terminal de turno y de una manera realmente fácil <img src="http://www.superjueves.net/pensamientosdeotromas/wp-includes/images/smilies/icon_biggrin.gif" alt=":D" class="wp-smiley" /> </p>
<p>Expect es una herramienta basada en el lenguaje Tcl, utilizada para automatizar aplicaciones interactivas como ssh, telnet, scp, ftp, etc, y todo esto de una manera rápida y sencilla.</p>
<p>Bien, pues empecemos con un ejemplo de una simple conexión por ssh:
</p></div>
<p>&nbsp;</p>
<div class="codecolorer-container tcl vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br /></div></td><td><div class="tcl codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">#!/usr/bin/expect -f</span><br />
<span style="color: #808080; font-style: italic;">########################</span><br />
<br />
<span style="color: #808080; font-style: italic;"># Desactivamos el timeout</span><br />
<span style="color: #ff7700;font-weight:bold;">set</span> timeout -<span style="color: #ff4500;">1</span><br />
<br />
<span style="color: #808080; font-style: italic;">## Definimos variables de la conexion</span><br />
<span style="color: #ff7700;font-weight:bold;">set</span> server dns_o_IP<br />
<span style="color: #ff7700;font-weight:bold;">set</span> port <span style="color: #ff4500;">22</span> <span style="color: #808080; font-style: italic;"># Por defecto el 22</span><br />
<span style="color: #ff7700;font-weight:bold;">set</span> user usuario_para_la_conexion<br />
<span style="color: #ff7700;font-weight:bold;">set</span> pass password_del_usuario<br />
<br />
<span style="color: #808080; font-style: italic;">#####################################</span><br />
<span style="color: #808080; font-style: italic;">## Inicio Script</span><br />
<span style="color: #808080; font-style: italic;">#####################################</span><br />
<span style="color: #808080; font-style: italic;">## Sacamos un mensaje al usuario</span><br />
send_user <span style="color: #483d8b;">&quot;Conectando a $server<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><br />
<br />
<span style="color: #808080; font-style: italic;">## Lanzamos un proceso que podemos controlar</span><br />
spawn ssh <span style="color: #ff3333;">$user</span>@<span style="color: #ff3333;">$server</span> -p <span style="color: #ff3333;">$port</span><br />
<br />
<span style="color: #808080; font-style: italic;">## Una especie de switch-case para controlar</span><br />
<span style="color: #808080; font-style: italic;">## &nbsp; lo que devuelve el comando</span><br />
expect <span style="color: black;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; -re <span style="color: #483d8b;">&quot;.*Are.*.*yes.*no.*&quot;</span> <span style="color: black;">&#123;</span> <span style="color: #808080; font-style: italic;">## Lo esperado como expresion regular.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; send <span style="color: #483d8b;">&quot;yes<span style="color: #000099; font-weight: bold;">\r</span>&quot;</span> <span style="color: #808080; font-style: italic;">## Si se cumple lo anterior pasamos a la terminar “yes\r”</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exp_continue <span style="color: #808080; font-style: italic;">## Continua con el siguiente resultado al comando expect</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: black;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">&quot;assword: &quot;</span> <span style="color: black;">&#123;</span> <span style="color: #808080; font-style: italic;">## Al ver que nos pide la password</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; send &nbsp;<span style="color: #483d8b;">&quot;$pass<span style="color: #000099; font-weight: bold;">\r</span>&quot;</span> <span style="color: #808080; font-style: italic;">## se la pasamos</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: black;">&#125;</span><br />
<span style="color: black;">&#125;</span><br />
send_user <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>Conectado a $server<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><br />
<br />
<span style="color: #808080; font-style: italic;">## Le decimos al script que pase el control al usuario</span><br />
<span style="color: #808080; font-style: italic;">## &nbsp; &nbsp;para que el continue utilizando la terminal</span><br />
interact</div></td></tr></tbody></table></div>
<p>&nbsp;</p>
<div>Bueno, como veis es bastante sencillito, no hace falta controlar mucho del lenguaje para manejar este tipo de scripts. Ahora simplemente modificando las variables tenéis un script que se conecta por ssh a la máquina que le digáis, de una manera muy rápida. Hasta podéis configurar el prompt sin necesidad de modificarlo en el .bashrc del servidor.<br />
Yo concretamente uso este tipo de script para conectarme a mis máquinas en el trabajo, y nunca me equivoco en la ip ni en el usuario ni en el password <img src="http://www.superjueves.net/pensamientosdeotromas/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> </div>
<p>&nbsp;</p>
<div> Ahora, podemos comprimir un directorio del que queramos hacer un backup (por ejemplo) una vez conectados a él con el script anterior y quitando el comando interact:
</div>
<p>&nbsp;</p>
<div class="codecolorer-container tcl vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br /></div></td><td><div class="tcl codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">#######################################</span><br />
<span style="color: #808080; font-style: italic;">## Creando tar</span><br />
<span style="color: #808080; font-style: italic;">######################################</span><br />
<span style="color: #808080; font-style: italic;">## Definimos variables</span><br />
<span style="color: #ff7700;font-weight:bold;">set</span> dirToBackup directorio_para_backup<br />
<span style="color: #ff7700;font-weight:bold;">set</span> tarFile /tmp/backup.tgz<br />
<span style="color: #ff7700;font-weight:bold;">set</span> tarCommand /bin/tar<br />
<br />
send_user <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>Creando tar de $server:$dirToBackup...<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><br />
<br />
<span style="color: #808080; font-style: italic;">## Lanzamos el comando</span><br />
send -- <span style="color: #483d8b;">&quot;$tarCommand zcvf $tarFile $dirToBackup<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><br />
expect <span style="color: black;">&#123;</span> &nbsp; <span style="color: #808080; font-style: italic;">## Este expect espera a que termine el comando y</span><br />
&nbsp; &nbsp; &nbsp; “<span style="color: #66cc66;">&gt;</span> “ <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span> <span style="color: #808080; font-style: italic;">## salgamos a la shell, vale para shells que terminan</span><br />
&nbsp; &nbsp; &nbsp; “<span style="color: #66cc66;">$</span> “ <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span> &nbsp; <span style="color: #808080; font-style: italic;">## por &gt; y $</span><br />
<span style="color: black;">&#125;</span><br />
send_user <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>Tar Generado.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><br />
<span style="color: #ff7700;font-weight:bold;">exit</span></div></td></tr></tbody></table></div>
<p>&nbsp;<br />
Y a continuación por ejemplo podemos copiarlo a local:<br />
&nbsp;</p>
<div class="codecolorer-container tcl vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br /></div></td><td><div class="tcl codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">########################################</span><br />
<span style="color: #808080; font-style: italic;">## Cerrando conexion con el servidor</span><br />
<span style="color: #808080; font-style: italic;">#######################################</span><br />
send -- <span style="color: #483d8b;">&quot;exit<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><br />
expect <span style="color: black;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">&quot;&gt; &quot;</span> <span style="color: black;">&#123;</span> <span style="color: black;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">&quot;$ &quot;</span> <span style="color: black;">&#123;</span> <span style="color: black;">&#125;</span><br />
<span style="color: black;">&#125;</span><br />
send_user <span style="color: #483d8b;">&quot;Salimos del servidor<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><br />
<br />
<span style="color: #808080; font-style: italic;">########################################</span><br />
<span style="color: #808080; font-style: italic;">## Copiamos backup a local</span><br />
<span style="color: #808080; font-style: italic;">########################################</span><br />
<span style="color: #ff7700;font-weight:bold;">set</span> scpCommand /usr/bin/scp<br />
<br />
send_user <span style="color: #483d8b;">&quot;Copiando tar...=&gt; $tarFile <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><br />
<br />
<span style="color: #808080; font-style: italic;">## Lanzamos el comando de copia remota scp</span><br />
spawn <span style="color: #ff3333;">$scpCommand</span> <span style="color: #ff3333;">$user</span>@<span style="color: #ff3333;">$server</span>:<span style="color: #ff3333;">$tarFile</span> .<br />
expect <span style="color: black;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; “<span style="color: #66cc66;">&gt;</span> ” <span style="color: black;">&#123;</span> <span style="color: black;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; “<span style="color: #66cc66;">$</span> ” <span style="color: black;">&#123;</span> <span style="color: black;">&#125;</span><br />
<span style="color: black;">&#125;</span><br />
send_user “Fin.\n”<br />
<span style="color: #ff7700;font-weight:bold;">exit</span></div></td></tr></tbody></table></div>
<p>&nbsp;</p>
<div>
Para más ayuda, tenemos el comando <a href="http://expect.sourceforge.net/example/autoexpect.man.html">autoexpect</a>. Este comando graba todo lo que hagamos en una terminal y lo va guardando en un archivo en formato expect, y una vez hayamos terminado podemos ejecutarlo. Esto, repetirá fiel y exactamente los mismo pasos que habíamos hecho. Esto ya es el colmo! <img src="http://www.superjueves.net/pensamientosdeotromas/wp-includes/images/smilies/icon_biggrin.gif" alt=":D" class="wp-smiley" /> </p>
<p>Imaginaros que cantidad de cosas podemos automatizar de una forma sencillita y cuanto tiempo y errores podemos ahorrarnos. Ahora piensa que cosas repites una y otra vez de forma repetitiva todos los días y podrías automatizar&#8230;. y hazlo!! <img src="http://www.superjueves.net/pensamientosdeotromas/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> </p>
</div>
<p>&nbsp;<br />
&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.superjueves.net/pensamientosdeotromas/2011/07/18/automatiza-todo-lo-que-puedas-con-expect/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
