Mostrando entradas con la etiqueta scripts. Mostrar todas las entradas
Mostrando entradas con la etiqueta scripts. Mostrar todas las entradas

lunes, 21 de julio de 2008

Buscando Datos en SQL Server 2005

Cuando nos enfrentamos a bases de datos de las cuales no conocemos su estructura y son medianamente grandes, y tenemos que buscar datos expecificos que se encuentran dentro y no sabemos por donde empezar, les dejo aqui un script que busaca una cadena de texto en toda la bbdd (en todas las tablas y en todos los campos). Demos las gracias a: Apaga y Vamonos

El script es el siguiente :

Use [miBaseDeDatos]

DECLARE @SQL NVARCHAR(4000)
DECLARE @PROXIMA_SENTENCIA NVARCHAR(3500)
DECLARE @NOM_TABLA NVARCHAR(255)
DECLARE @NOM_COLUMNA NVARCHAR(255)
DECLARE @REGISTROS int
DECLARE @CADENA_BUSCAR NVARCHAR(255)
SET @CADENA_BUSCAR = 'prueba'

DECLARE CURSOR_SELECT
CURSOR FOR
SELECT TABLE_NAME
FROM information_schema.tables

OPEN CURSOR_SELECT FETCH NEXT FROM CURSOR_SELECT INTO @NOM_TABLA
-- Recorre las tablas de la base de datos
WHILE @@FETCH_STATUS = 0
BEGIN
print '-----------------------'
print 'TABLA: ' + @NOM_TABLA
print '-----------------------'
-- Crea la cadena de búsqueda
SET @PROXIMA_SENTENCIA = 'SELECT Count(*) FROM ' + @NOM_TABLA + ' WHERE 1=0'
-- Crea el cursor de campos de búsqueda
DECLARE CURSOR_CAMPOS
CURSOR FOR
SELECT COLUMN_NAME
FROM information_schema.columns
WHERE TABLE_NAME like @NOM_TABLA
AND (DATA_TYPE = 'nvarchar' OR DATA_TYPE = 'varchar' OR DATA_TYPE = 'char')
OPEN CURSOR_CAMPOS FETCH NEXT FROM CURSOR_CAMPOS INTO @NOM_COLUMNA
WHILE @@FETCH_STATUS = 0
BEGIN
SET @PROXIMA_SENTENCIA = @PROXIMA_SENTENCIA + ' OR ' + @NOM_COLUMNA + ' like ''%' + @CADENA_BUSCAR + '%'''
FETCH NEXT FROM CURSOR_CAMPOS INTO @NOM_COLUMNA
END
-- Libera memoria
CLOSE CURSOR_CAMPOS
DEALLOCATE CURSOR_CAMPOS
print @PROXIMA_SENTENCIA
-- Ejecuta la sentencia para comprobar si obtiene algún resultado
SELECT @sql = 'DECLARE CURSOR_SENTENCIA CURSOR FOR ' + @PROXIMA_SENTENCIA
EXEC sp_executesql @sql
OPEN CURSOR_SENTENCIA FETCH NEXT FROM CURSOR_SENTENCIA INTO @REGISTROS
WHILE @@FETCH_STATUS = 0
BEGIN
print 'Registros ' + str(@REGISTROS)
FETCH NEXT FROM CURSOR_SENTENCIA INTO @REGISTROS
END
-- Libera memoria
CLOSE CURSOR_SENTENCIA
DEALLOCATE CURSOR_SENTENCIA
FETCH NEXT FROM CURSOR_SELECT INTO @NOM_TABLA
END

/* Libera la memoria */
CLOSE CURSOR_SELECT
DEALLOCATE CURSOR_SELECT
Espero que os sea de utilidad , a mi me ha arreglado el día.

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.


jueves, 30 de agosto de 2007

Tranquilo pero Expectante

Hay por ahí un lenguaje por llamarle algo, de nombre EXPECT. Lo curioso de este lenguaje es que esta pensado para realizar dialogos, tomando como canal de comunicación la entrada y la salida standard. ¿Y que para que sirve eso? Pues para automatizar tareas o realizar scripts que tengan que dialogar con otras aplicaciones.

La sintaxis del lenguaje es muy sencilla y los 3 comandos básicos son spawn (ejecutar un comando o script), expect (espera a recibir algo) y send (envia lo que le digas por la salida standard). Hay más os podeis documentar aki.

Antes de nada hay que instalar Expect en vuestra maquina con Ubuntu, para ello os podeis hacer un script de instalación que contendría las siguientes lineas:

#!/bin/bash
gksudo apt-get install expect


El ejemplo típico es el de automatizar la bajada y/o subida por ftp. Yo en este post pondré como ejemplo como sacar la ip publica con la que esta conectado mi router. El modelo de router que estoy utilizando es "router inalámbrico Xavi 7868r". El modelo de router nos va a determinar que comandos habrá que enviarle por telnet para que nos diga la IP. De todos los router que han pasado por mis manos todos tienen telnet y un juego de comandos para configurarlo o ver su configuración, esto a parte del servidor web. Por lo que creo esto vale para cualquiera que tenga un router y este interesado en saber su IP pública.

Antes de nada intentaros conectar a vuestro router, por telnet desde la consola. Para ello hacer:

$ telnet [ip del router]


Una vez hecho esto quedaros con la linea escrita por pantalla que os pide el login. Introducir el login.
Fijaros como os pregunta el router el password. Y fijaros como es promtp de la consola. Una vez hecho esto tenenis que averiguar que comando os dice la IP pública y aqui os toca investigar, probar introduciendo help, ? , ... para conseguir un listado de los comandos disponibles. Cuando sepais esto averiguar cual es el comando para salir. Una vez logrado esto ya teneis toda la información necesaria para realizar este script de expect con exito. Datos que hay que apuntar :
  • texto que usa el router para preguntar el login
  • idem para el password
  • idem pero para el prompt de la consola
  • comando para saber la ip pública
  • comando para salir
  • usuario y password
Si habéis conseguido toda esta información o tenéis un router como el mio ya podeis ejecutar este script para saber cual es la IP pública de casa en un moment sin tener que preguntarselo a mano al router. O para usar esta info en otros programas. En mi caso lo uso para tener mi equipo localizado ya como tengo IP dinámica, nunca se que ip tiene y no puedo acceder a ordenata. Hay otras alternativas como usar servicios gratuitos de terceros que te asignan una DNS a tu ip dinámica, pero se necesita de un cliente y se depende de la empresa que te el servicio. Yo con ayuda de otro script me envío a mi dir de correo electrónico la ip de mi equipo cuando esta ha cambiado. Y de esta manera siempre que tengo internet puedo acceder a mi maquina. :)

Script que escupe la ip publica del router :

#!/usr/bin/expect
#lanzamos un cliente de telnet
spawn telnet 192.168.1.1
#esperamos a que nos pida el login
expect "Login:"
#enviamos nuestro login
send "1234\r"
#esperamos a que nos pregunte el pass
expect "Password:"
#enviamos el password
send "1234\r"
#esperamos a que envie el prompt de la linea de comandos
expect -exact "-->"
#enviamos el comando para que nos liste las interfaces de red
send "ip list interfaces\r"
expect -exact "-->"
#enviamos el comando de salida
send "user logout\r"


Lo que va entrecomillado es la info que se envía que variara en función de cada router. Si tenéis el mismo router que yo. solo tenéis que cambiar el usuario y el password.