miércoles, 26 de septiembre de 2007

El tiempo es Oro


No se porque pero muy pocas veces consigo que el ordenador trabaje por mi, siempre acabo reinventando la rueda y al final trabajo para el ordenador.

Para no caer en este error. Voy a explicaros como programar tareas en ubuntu. Deciros donde se ubican los programas que trae ubuntu y podáis empezar a investigar que hacen esos programas y así os iréis enterando de que hay un montón de cosas que están hechas ya y no existe la necesidad de volverlas a programar.

El programa que vamos a usar para programar las tareas es el cron que viene de serie con ubuntu. Si queréis tener un interface gráfico para este programa os podeis bajar el gnome-sheulde e instalarlo. Tal que asi:

fichero de instalación : gnome-shedule_INSTALL.sh

Primero crear y editar el fichero de instalación: $gedit gnome-shedule_INSTALL.sh

#!/bin/bash
sudo apt-get install gnome-shedule

le dais permisos de ejecución : $chmod +x gnome-shedule_INSTALL.sh
y lo ejecutais : $./gnome-sheduler_INSTALL.sh

Si todo ha salido bien deberías tener un lanzador en : Aplicaciones/Herramientas del Sistema/Horario si hacéis click sobre él, os debería de aparecer el siguiente formulario :

Para programar una tarea basta con hacer click en el botón de nuevo. donde se nos preguntara si lo que queremos es que se repita la tarea con una frecuencia ó que solo se ejecute una vez. En función de nuestra selección se nos presentaran los siguientes formularios para terminar de completar la definición de la tarea y cuando ha de ejecutarse.

En la siguiente imagen podéis ver lo sencillo que es programar una tarea.


Para programar una tarea que no sea repetitiva lo único que cambia es que en vez de especificar un frecuencia de ejecución, se nos da la posibilidad de escoger fecha y hora.

Ahora bien para los amantes de la consola. O la gente que quiera saber por que en vista previa pone
*/2 * * * * ls vamos a explicar como configurar el cron desde la linea de comandos. El programa debería estar en /usr/bin/cron y para inicializarlo, pararlo o reiniciarlo, pues como todos los servicios. Nos vamos /etc/init.d/ y visualizamos el fichero /etc/init.d/cron que tiene este aspecto :

#!/bin/sh
# Start/stop the cron daemon.
#
### BEGIN INIT INFO
# Provides: cron
# Required-Start: $syslog $time
# Required-Stop: $syslog $time
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Regular background program processing daemon
# Description: cron is a standard UNIX program that runs user-specified
# programs at periodic scheduled times. vixie cron adds a
# number of features to the basic UNIX cron, including better
# security and more powerful configuration options.
### END INIT INFO


test -f /usr/sbin/cron || exit 0

#LSBNAMES='-l' # Uncomment for LSB name support in /etc/cron.d/

. /lib/lsb/init-functions

case "$1" in
start) log_daemon_msg "Starting periodic command scheduler" "crond"
start-stop-daemon --start --quiet --pidfile /var/run/crond.pid --name cron --startas /usr/sbin/cron -- $LSBNAMES
log_end_msg $?
;;
stop) log_daemon_msg "Stopping periodic command scheduler" "crond"
start-stop-daemon --stop --quiet --pidfile /var/run/crond.pid --name cron
log_end_msg $?
;;
restart) log_daemon_msg "Restarting periodic command scheduler" "crond"
start-stop-daemon --stop --retry 5 --quiet --pidfile /var/run/crond.pid --name cron
start-stop-daemon --start --quiet --pidfile /var/run/crond.pid --name cron --startas /usr/sbin/cron -- $LSBNAMES
log_end_msg $?
;;
reload|force-reload) log_daemon_msg "Reloading configuration files for periodic command scheduler" "crond"
# cron reloads automatically
log_end_msg 0
;;
*) log_action_msg "Usage: /etc/init.d/cron {start|stop|restart|reload|force-reload}"
exit 2
;;
esac
exit 0

Como podéis ver si os fijáis en este script de sh acepta los siguientes parametros : start , stop, restart, reload, force-reload esto es así para todos los servicios de ubuntu. Los scripts que se encuentran en este directorio se ejecutan cuando arranca el sistema, entonces si no queremos que se ejecute al servicio al inicio lo que debemos hacer es quitarle los permisos de ejecución al servicio en cuestión. Para ello basta con hacer lo siguiente :

$ cd /etc/init.d
$ chmod -x nombre_servicio

Bueno ahora vamos a configurar el cron ya que sabemos como iniciarlo y pararlo. Como todos los programas su configuración esta en /etc si hacemos :

$ ls /etc | grep cron
cron.d //Los scripts en este directorio se ejecutan al arranque del cron
cron.daily //Los scripts dentro de este directorio se ejecutan diariamente
cron.hourly //Aqui cada hora
cron.monthly // Cada mes
crontab // fichero de configuración
cron.weekly // Cada semana
Como veis hay 5 directorios y un fichero (crontab). Los directorios contienen scripts que se ejecutaran con una cierta frecuencia. Si visualizamos el fichero crontab entenderemos por que esto es así y la linea de vista previa comentada antes.
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
Los campos y los valores permitidos son :
m --> minutos --> 0-59 y *
h --> horas --> 0-23 y *
dom --> dia del mes --> 1-31 y *
mon --> mes --> 1-12 y *
dow --> dia de la semana --> 0-7 y *
user --> usuario --> indica con que permisos de usuario del sistema se va a ejecutar el comando.
command --> comando a ejecutar --> comando que se encuentre en algún path de los indicados en PATH.

El valor * significa todos los valores. Quiero decir que si el campo minuto tiene el valor de * se ejecutara cada minuto. Si por ejemplo ponemos */10 se ejecutará cada diez minutos. Otra alternativa seria poner 0,10,20,30,40,50. Si queremos otra interface para configurar el cron, podemos usar el comando :


$ crontab -e

Se nos abre un fichero con la misma sintaxis, pero con la peculiaridad de que estas tareas se ejecutaran para el usuario que ha ejecutado el comando.


Y que pasa si queremos que las tareas no se ejecuten a una hora determinada o con una frecuencia determinada, sino lo que queremos es que se ejecute una tarea cuando suceda algo en el sistema. Vamos que podamos programar tareas en función de algún evento que suceda. Pues la solución para esto es el
icron . Este servicio no viene de serie en Ubuntu. En esta dirección tenéis la info necesaria para instalarlo.

icrontab -e : abre la tabla para la edición
icrontab -l : lista el contenido de la tabla
icrontab -r : borra el contenido de la tabla


La tabla tiene el siguiente formato

ruta evento comando


Eventos disponibles

IN_ACCESS Acceso de lectura
IN_MODIFY Acceso de escritura
IN_ATTRIB Metadatos Modificados (inodo o atributo)
IN_CLOSE_WRITE Fichero abierto para escritura y luego cerrado
IN_CLOSE_NOWRITE Fichero abierto sin escritura y luego cerrado
IN_CLOSE Fichero cerrado
IN_OPEN Fichero abierto
IN_MOVED_FROM Fichero movido a otro directorio
IN_MOVED_TO Fichero movido a este directorio
IN_MOVED Fichero movido
IN_DELETE Fichero borrado
IN_DELETE_SELF El directorio supervisado ha sido borrado
IN_ALL_EVENTS Que ocurra algun evento de los mencionados
Parametros para los comandos :

$@ Proporciona la ruta
$# Nombre del fichero que ha disparado el evento
$% Muestra el evento disparado
$$ El propio signo dolar
Alá pos ahora ya sabemos como hacer para que nuestro sistema haga cosas de forma repetitiva, en un momento determinado o cuando suceda algo. Es decir ya tenemos la capacidad para programar algo. Ahora solo nos hace falta los programas que lanzar. Para ello investigar en /usr/bin y en /usr/sbin

martes, 18 de septiembre de 2007

Internet : La red de Redes


Si le llaman la red de redes es por algo y estoy convencido que la mayoría de la gente lo asocia con el internet explorer. Y que en internet lo único que hay son paginas web. Y se olvidan que internet son un montón de ordenadores conectados entre si con un protocolo en común "internet protcol" IP. Que nos aporta esto??? el poder identificar los ordenadores en la red y poder acceder a ellos. Y esto para que sirve ?? pues para permitir a los programas que tenemos en nuestro ordenador hablar con otros programas de otros ordenadores, con esto quiero decir que puedan localizar al programa con el que se quiere hablar.

Dado que lo que se hace es dar la posibilidad de localizar un ordenador en la red para que hablen dos programas entre si, aquí es donde aparecen los conceptos de cliente y servidor. Donde el servidor es un programa que espera a que le hablen, le pregunten,.... y el cliente es el programa que hace las preguntas,... Un servidor web es un programa que espera que le pidan paginas web y el "internet explorer" , "firefox",... son clientes que le piden al servidor una pagina especifica. En este post no voy a explicar como montar un servidor web ni configurarlo (todo se andará), pero aprovechando el ejemplo del post : Trankilo pero Expectante, donde se explicaba como obtener la ip publica con la que se conectaba el router de una tipica red LAN casera. Voy a explicar como tener a nuestro ordenador localizado en la red y poder acceder a él desde cualquier ordenador que tenga internet. Seguidamente daré las pautas mínimas para montar un servidor de ftp y scp en nuestra maquina con Ubuntu y de esta manera tendremos acceso a los archivos de nuestra maquina desde cualquier sitio con internet. También servirá para poder enviarlos ficheros a nuestro ordenador.

#!/usr/bin/expect

set ipaddr [lindex ${argv} 0]
set usr [lindex ${argv} 1]
set pwd [lindex ${argv} 2]

spawn telnet ${ipaddr}

set timeout 600

expect -nocase "Login: " {
sleep 1
send "${usr}\r"
sleep 1
} timeout {
send_user "ERROR: Timeout intentando copia SCP"
exit 1
}



set timeout 600

expect -nocase "Password: " {
sleep 1
send "${pwd}\r"
sleep 1
} timeout {
send_user "ERROR: Timeout intentando copia SCP"
exit 1
}


send -- "ip list interfaces\r"
sleep 3
send -- "user logout\r"


interact
Nota : RECORDAR que esto es para un router especifico, "Xavi 7868r". En este script se ha modificado un poco para que pueda aceptar parámetros. Si combinamos este script en expect con este otro en bash. conseguimos que se nos mande a una dirección de correo electrónico nuestra IP pública.
#/bin/bash
expect -f Obtener.Ip.Publica 192.168.1.1 1234 1234 | grep "ppp-0" > ip.publica
mail -s "jeje" direccion@gmail.com < ip.publica

192.168.1.1 ip del router
1234 usuario del router
1234 password del router
"jeje" asunto del mail que se envia
Este script lo que hace es ejecutar el script de expect y guardar en el fichero "ip.publica" la ip publica de nuestro router y con el programa mail enviarlo a una dir de correo electrónico. Ahora ya tenemos 2 scripts que nos permiten enviar nuestra Ip a dirección de correo electrónico. Ahora lo que nos falta para que este todo perfecto es que esta tarea se repita o que se realice cuando nos cambie la ip del router. Lo de enviar la ip cuando cambie os lo dejo para vosotros (el comando diff de bash compara ficheros). Ahora lo que queda es configurar el cron o el icron para que realice la tarea de consulta de ip pública y el envío de mail a dir de correo si miráis el post : El tiempo es Oro viene explicado como configurar el cron y el icron para que realicen estas tareas.

Con esto siempre que estemos en un equipo con internet, podremos consultar nuestra cuenta de correo y ver cual es la ip de nuestro equipo. La finalidad de todo esto es poder cojer o enviar ficheros para nuestro equipo. Para ello habrá que instalar con un servidor que nos permita envío y la recepción de ficheros. La opción mas fácil es usar SCP pero windows no da soporte por defecto para este protocolo. Ubuntu lo trae por defecto. Hay que activar el servicio del ssh y configurar el fichero /etc/shh. Para los casos que no tengamos la disponibilidad de usar scp podemos montar un servidor de ftp. Ya que windows y el internet explorer trae un cliente de ftp por defecto. Para instalar un servidor de ftp basta ejecutar la siguiente linea de comandos.

$ sudo apt-get install vsftpd
Para configurar este servidor de ftp hay que editar este fichero de configuración : /etc/vsftpd.conf las opciones que nos permite son las siguientes :
anonymous_enable Si el valor de esta directiva es YES cualquier usuario se puede conectar al servidor dando el nombre de usuario anonymous o ftp. Por razones de seguridad se debe poner NO (anonymous_enable=NO)
local_enable
Esta línea indica que si se permite o no el acceso de usuarios locales a sus respectivas carpetas privadas. Si se permite el acceso habría que poner local_enable=YES (local_enable=NO en caso contrario).
chroot_local_user Permite enjaular a los usuarios dentro de su propio directorio personal. Si en el fichero de configuración aparece chroot_local_user=NO, entonces el usuario tiene acceso a todo el sistema de archivos, en función de los permisos asignados. Cuando un usuario local se conecta y en el fichero de configuración aparece chroot_local_user=YES, entonces enjaulamos a los usuarios dentro de su propio directorio personal, sin posibilidad de acceder a todo el sistema de ficheros. Se mejora por tanto la seguridad.
write_enable Con esta directiva se puede permitir o denegar la subida de ficheros al servidor FTP. Si se permite que los usuarios suban archivos al servidor FTP habría que poner write_enable=YES.
local_umask
Se pueden establecer los permisos con los que quedará el archivo al subirlo al servidor FTP. local_umask=022 indicará que los permisos de los archivos serán 644, es decir, lectura y escritura para el propietario del fichero, y sólo lectura para el grupo y los demás.
anon_upload_enable Esta directiva indica si los usuarios anónimos pueden cargar archivos en el servidor. anon_upload_enable=YES permite que los usuarios anónimos puedan subir ficheros.
anon_mkdir_write_enable Si esta directiva tiene el valor YES se permitirá la creación de directorios en el servidor.
ftpd_banner Con esta directiva se puede mostrar un mensaje de bienvenida cuando un usuario se conecte al servidor FTP. ftpd_banner=?Bienvenido a mi servidor FTP?. anon_max_rate Se utiliza para limitar la tasa de transferencia a usuarios anónimos. En el siguiente ejemplo se limita la tasa de transferencia a los usuarios anónimos a 10Kb/s: anon_max_rate=1024
local_max_rate Se utiliza para limitar la tasa de transferencia en bytes por segundo a los usuarios locales del servidor. En el siguiente ejemplo se limita la tasa de transferencia a 10Kb/s: local_max_rate=1024
max_clients Indica el número máximo de cliente que podrán conectarse simultáneamente al servidor. En el siguiente ejemplo son 5: max_clients=5
Para iniciar parar o reiniciar el servidor de ftp usar :
# sudo /etc/init.d/vsftpd {start|restart|stop}

Ahora si lo que queremos es usar el scp o el ssh, necesitaremos instalarnos un servidor de ssh. Para ello más de lo mismo :

# sudo apt-get install openssh-server
Así instalamos el servidor y para configurarlo en /etc/ igualito que el servidor de ftp distintas opciones pero más de mismo. Si la maquina que estamos usando tiene linux (la que no es la nuestra) y queremos acceder a nuestro equipo de casa. Lo tenemos ya todo de serie. Con estos comandos ya podemos subir / bajar / controlar nuestro equipo remotamente. Para ello :

# ssh ip // abrimos una sesion en nuestro equipo
# ftp ip // abrimos una sesión de ftp para subir o bajar ficheros
# scp ip // abrimos una sesión de scp para subir o bajar ficheros
Donde la ip es la que leemos de nuestra cuenta de correo. Advertencia si estamos detrás de un router abra que direccionar los puertos a nuestra maquina. Para ello hay que modificar los parámetros de NAT del router. Donde hay que especificar los puertos del router externos los direccione a nuestra IP local de la maquina a tal puerto. Por defecto el ftp usa el puerto 21 y el ssh el 22. Esto se puede configurar a gusto de cada uno. En los ficheros de configuración de los servidores.

Si por el contrario estamos trabajando con Windows necesitaremos de unos programas para poder abrir estas sesiones contra nuestra maquina para ello descargarse estos programas que son libres y gratuitos :

ssh : usar el putty
scp : usar el winSCP
ftp : usar Filezilla
Alá pos ya tenemos acceso a nuestro equipo de casa y tenemos la posibilidad de lanzar comandos desde la consola en nuestra maquina de casa(ssh) y de subir y bajar ficheros a nuestro equipo de casa gracias al servidor de (ftp y scp). Ya no tenemos que cargar con nuestra pinza de usb, cd, dvds u medios de almacenamiento para transportar nuestros datos. Lo único que necesitamos es una conexión a internet.

Para los que no quieran tener el equipo de casa siempre encendido. Existe una forma de encenderlo remotamente. Para ello la tarjeta de red que usemos y nuestra placa base ha de tener la característica de WOL (wake on lan). También es necesario un programa externo que nos permita enviar a nuestra maquina un Magic Packet, para que encienda el equipo. Pero esto os lo dejo a vosotros para que investigues algo.


domingo, 2 de septiembre de 2007

Scripts en Bash

Bash, es un interprete de comandos, hay otros como pueden ser ksh, csh, tcsh, Bourne Shell (Bash). Ubuntu trae por defecto bash. Para ver que interprete de comandos se esta ejecutando cuando abres una terminal. Para averiguar esto introduce :

$ echo $shell
/bin/bash
$ echo $BASH_VERSION
3.2.13(1)-release
Esta es la versión que me vino a mi instalada con la versión 7.04 de Ubuntu. Por que usar scripts en bash u otro interprete de comandos. En linux casi todo es un fichero, y los comandos de bash nos permiten manipular ficheros, los programas equivalen a comandos. A parte de esto bash permite el uso de variables , operaciones matemáticas, trabaja con expresiones regulares, permite capturar las señales del sistema,...

Para escribir un scirpt es bash es muy sencillo solo hay que editar un fichero y darle permisos de ejecución. El fichero es de texto plano. Otra característica de los interpretes de comandos es que son lenguajes interpretados no compilados. Vamos con el primer ejemplo un "Hola Mundo" que clásico.

Vamos a usar los siguientes comandos : echo, touch, chmod y cat. "echo" lo que hace es sacar por la salida standard (la pantalla) lo que se le pasa por parámetro, puede ser texto o una variable que es lo que vimos en el ejemplo de antes. "touch" lo usaremos para crear un fichero vacio y "chmod" para cambiarle los permisos al fichero y hacerlo de esta manera ejecutable. "cat" muestra el contenido de un fichero.

Que vamos a hacer en nuestro primer script. Crearemos un fichero vacio con touch, con echo iremos direccionando la salida standard al fichero que hemos creado para ir escribiendo en el. Después le daremos permisos de ejecución al usuario. Una vez hecho esto ejecutaremos el script para ver el resultado y visualizaremos el contenido de nuestro script.

¿? Como es el formato de un fichero para que sea interpretado como un script. Pues el formato es muy sencillo. La primera linea ha de especificar la ubicación del interprete que se va a usar. El resto de lineas equivalen a los comandos. Para escribir los comentarios se usa el caracter de escape #.

#!/bin/bash
#
# Esto es un comentario
#
comando
comando
comando
.....

Vamos allá para crear nuestro primer script abrir una terminal ( Aplicaciones/Accesiorios/Terminal) hacer click e introducir lo siguiente :

$ touch Hola_Mundo.sh
$ echo '#!/bin/bash' > Hola_Mundo.sh
$ echo '#' >> Hola_Mundo.sh
$ echo '# 1º script : Hola Mundo' >> Hola_Mundo.sh
$ echo '#' >> Hola_Mundo.sh
$ echo 'echo "Hola Mundo"' >> Hola_Mundo.sh
$ chmod +x Hola_Mundo.sh
$ ./Hola_Mundo.sh
Hola Mundo
$ cat Hola_Mundo.sh
#!/bin/bash
#
# 1º script : Hola Mundo
#
echo "Hola Mundo"

En los scripts venideros abstenerse de crealos así. Quiero decir las próximas veces que vayáis a hacer un script usar un editor de textos ("gedit" Aplicaciones/Accesorios/Editor de Textos) o si os gusta más la consola podéis usar el vi o el Emacs. En este ejemplo lo hemos hecho así para que aprendieses más de un comando y no solo el echo. Para introduciros en el mundo de las tuberías. A ver si os ibais a pensar que la imagen que esta en el post no tenia nada que ver con su contenido. Por cierto si hacéis click sobre la imagen podéis echaros una partidilla , es un juego :).

Las tuberías lo que vienen a hacer en linux es controlar los flujos de datos generados por los programas, pudiendo coger la salida de un programa y pasársela a otro como parámetro. En este ejemplo que acabamos de hacer no hay ninguna tubería pero si direccionamientos. El carácter que se usa para los direccionamiento es el ">" ó "<". Con este carácter podemos coger la salida de un programa y enviársela a otro programa o a un fichero como en este caso. También se puede hacer al revés coger el contenido de un fichero y pasárselo a un programa. En el ejemplo usamos el > para pasar la salida del echo a un fichero. Luego de este usamos ">>" para que escriba a modo "append" en el fichero, quiero decir añadiendo lineas y no sobreescribiendo la primera.

En este ejemplo también se muestra la forma de ejecutar un script, se puede hacer de 2 maneras :

$ ./ [script]
ó
$ source [script]

Bueno si el tema os ha parecido interesante podéis esperar a que escriba el siguiente post sobre el tema o ir leyéndoos este manual sobre bash que ta bastante bien para gente que se inicia en el mundillo. Si con ese no os llega seguir con este bash avanzado.


sábado, 1 de septiembre de 2007

NoSoloLinux


Lo que hace que me mueva es la música. Por ello no si quedara sin su espacio en mi blog. Pero con el paso del tiempo me vuelto vago y ya no me informo. La culpa de las radios de internet. Han conseguido que deje bajar música, bueno grabo las emisoras, con lo que les he perdido la pista a mis artistas favoritos. Lo único bueno de esto es cuando voy a verlos en directo, me sorprenden aún más si cabe.

Ahora mismo a lo que toi enganchadisimo es al minimal, pero lo curioso de esto es que la radio que escucho es de Rusia, curioso nunca me había fijado en este país en lo que se refiere a musica electrónica.

Este es el link : Deep Mix Moscow Radio

Pero a mi lo que me gusta es el Technazo y cuanto más harto mejor. Eso si el schranz ya me parece que esta entre la delgada linea del ruido y la musica. Como emisora de radio preferida de technazo tengo esta : Addictivebeat lo malo de esta emisora es que no siempre es techno, pero la mayor parte del día si. Y no veas vaya sesiones me he grabado yo de aki, jejeje.

Escucho más emisoras de radio pero estas dos son mi fuente. Y claro esto para estar en casa, por que depues lo que tira de mi son las estampas como las de la foto, atardecer en Monegros. Joer que recuerdos. Menos mal que lo repiten todos los años pq al final no da tiempo a na.