viernes, 18 de diciembre de 2009

Matando conexiones tcp ( tcpkill )

Este post esta dedicado a matar conexiones tcp, muchas veces tenemos alguna conexión tcp que queremos matar, pero no queremos matar el proceso. Por ejemplo una consola de vnc manejada por qemu. Para estos casos en que solo queremos matar la conexión tcp podemos utilizar el comando tcpkill (que lo provee el paquete dsniff), el uso del mismo es el siguiente:

pepo@frank:~$ tcpkill --help
tcpkill: invalid option -- -
Version: 2.4
Usage: tcpkill [-i interface] [-1..9] expression

Donde:
                -i interface # es la interface de red
               [-1.. 9 ] #el grado de fuerza bruta con el que se mata la conexión, el default es 3
                expression # filtro a utilizar, al estilo tcpdump (host, port, etc)

Ejemplo:

Vemos la conexión a matar

pepo@frank:~$ netstat -nalp|grep vnc
(No todos los procesos pueden ser identificados, no hay información de propiedad del proceso
 no se mostrarán, necesita ser superusuario para verlos todos.)
tcp        0      0 172.xx.xx.xx:40184      172.xx.xx.xx:5922       ESTABLECIDO 4426/vncviewer 
unix  3      [ ]         FLUJO      CONECTADO     540821   4426/vncviewer     

Matamos

pepo@frank:~$ sudo tcpkill -i eth0 host 172.20.70.19 and port 5922
[sudo] password for pepo:
tcpkill: listening on eth0 [host 172.20.70.19 and port 5922]
172.20.70.19:5922 > 172.16.99.39:40184: R 2779891000:2779891000(0) win 0
172.20.70.19:5922 > 172.16.99.39:40184: R 2779891181:2779891181(0) win 0
172.20.70.19:5922 > 172.16.99.39:40184: R 2779891543:2779891543(0) win 0
172.16.99.39:40184 > 172.20.70.19:5922: R 3942621646:3942621646(0) win 0
172.16.99.39:40184 > 172.20.70.19:5922: R 3942623978:3942623978(0) win 0
172.16.99.39:40184 > 172.20.70.19:5922: R 3942628642:3942628642(0) win 0

Y listo....

pepo@frank:~$ netstat -nalp|grep vnc
(No todos los procesos pueden ser identificados, no hay información de propiedad del proceso
 no se mostrarán, necesita ser superusuario para verlos todos.)

viernes, 27 de noviembre de 2009

passwd desde stdin

Esto es para los que alguna vez tuvieron que crear usuarios y por cada uno de ellos ejecutar el comando passwd.
Lo primero a saber es que el binario de las distribuciones de Red Hat (rhel/fedora) no es igual que el de debian, por lo que en Debian deberemos hacerlo de otra forma.

Paso a detallar:

 rhel/fedora )
                        El binario de estas distribuciones soporta el flag --stdin que le indica que teme como input la entrada estandar (stdin), por lo cual podriamos ejecutar

#echo "password" | passwd --stdin

debian )
                      Como les comenté antes, el binario de debian no soporta este flag, por lo que para emularlo deberiamos correr el siguiente comando:

#(sleep 1;echo "password";sleep 1;echo "password") | passwd

viernes, 9 de octubre de 2009

Viernes de Basquet.. dos pasiones

Dos pasiones se unen con esta foto, una notebook corriendo Linux (Ubuntu) y una de mis zapatillas de basquet....



jueves, 8 de octubre de 2009

Jugando con LVs y xfs

Esto no va ser un manual ni sobre LVs ni xfs, simplemente un mini-howto basado en un caso real
Una pequeña introducción, algunas veces sucede que no tenemos la posibilidad de sentarnos frente al servidor que deseamos instalar y el mismo tampoco cuenta con una consola de administración remota al estilo Drac (de Dell) o ilom (de Sun). Por lo que no nos queda otra opción que otra persona realice la instalación del sistema base y habilite ssh para que podamos acceder remotamente.
Este es el caso, usando Debian 5 con una instalación base con Lvs (es una de las opciones que nos ofrece al instalar).
Bueno, sin más preámbulo, este es el escenario con el que nos encontramos al acceder por primera vez al equipo:

Miro FS montado:

debian5:~# df

S.ficheros Bloques de 1K Usado Dispon Uso% Montado en
/dev/mapper/debian5-root
329233 81766 230469 27% /
tmpfs 972976 0 972976 0% /lib/init/rw
udev 10240 668 9572 7% /dev
tmpfs 972976 0 972976 0% /dev/shm
/dev/sda1 233335 16379 204508 8% /boot
/dev/mapper/debian5-home
296395632 195628 281143928 1% /home
/dev/mapper/debian5-tmp
376807 10289 347062 3% /tmp
/dev/mapper/debian5-usr
4805760 397960 4163680 9% /usr
/dev/mapper/debian5-var
2882592 272504 2463656 10% /var

Como vemos tiene el /boot montado sobre la partición sda1 y luego utiliza lvs creados sobre el VG debian5.

Miro los LVs creados:

debian5:~# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
home debian5 -wi-ao 287,17G
root debian5 -wi-ao 332,00M
swap_1 debian5 -wi-ao 2,53G
tmp debian5 -wi-ao 380,00M
usr debian5 -wi-ao 4,66G
var debian5 -wi-ao 2,79G

Miro los VGs creados:

debian5:~# vgs
VG #PV #LV #SN Attr VSize VFree
debian5 1 6 0 wz--n- 297,85G 0


Miro los discos:

debian5:~# fdisk -l

Disco /dev/sda: 320.0 GB, 320072933376 bytes
255 heads, 63 sectors/track, 38913 cylinders
Units = cilindros of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000c9f92

Disposit. Inicio Comienzo Fin Bloques Id Sistema
/dev/sda1 * 1 31 248976 83 Linux
/dev/sda2 32 38913 312319665 8e Linux LVM

Disco /dev/sdb: 320.0 GB, 320072933376 bytes
255 heads, 63 sectors/track, 38913 cylinders
Units = cilindros of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000e0177


Hasta aca toda la información que recolectamos, nuestro objetivo es crear un lv (que llamaremos events) con el máximo de tamaño posible, para ello eliminaremos el lv "home" (que luego volveremos a crear con menos espacio) y utilizaremos el disco sdb para extender el vg debian5 y poder crear el lv "events" que deseamos y darle fs xfs.

Manos a la obra:

Primero instalo las herramientas que necesitaré: (xfsprogs)

debian5:~# apt-get install xfsprogs

Desmonto el /home

debian5:~# umount /home/

Elimino el lv y lo vuelvo a crear (si, ya se que podria reducir el tamaño del actual)

debian5:~# lvremove /dev/debian5/home
Do you really want to remove active logical volume "home"? [y/n]: y
Logical volume "home" successfully removed


debian5:~# lvcreate -n home -L 10G debian5
/dev/cdrom: open failed: Sistema de ficheros de sólo lectura
Logical volume "home" created

Le damos FS ext3 al LV

debian5:~# mkfs.ext3 /dev/debian5/home

Verificamos con mount -a (la entrada del home ya estaba en el fstab originalmente)

debian5:~# mount -a

Particionamos el disco sdb, formato 8e (Linux LVM)

Esto lo hicimos de forma interactiva, en un post anterior mío encontraran la forma de hacerlo con un script.

debian5:~# fdisk /dev/sdb

El número de cilindros para este disco está establecido en 38913.
No hay nada malo en ello, pero es mayor que 1024, y en algunos casos
podría causar problemas con:
1) software que funciona en el inicio (p.ej. versiones antiguas de LILO)
2) software de arranque o particionamiento de otros sistemas operativos
(p.ej. FDISK de DOS, FDISK de OS/2)

Orden (m para obtener ayuda): n

Orden (m para obtener ayuda): n
Acción de la orden
e Partición extendida
p Partición primaria (1-4)

p

Número de partición (1-4): 1
Primer cilindro (1-38913, valor predeterminado 1):
Se está utilizando el valor predeterminado 1
Último cilindro o +tamaño o +tamañoM o +tamañoK (1-38913, valor predeterminado 38913):
Se está utilizando el valor predeterminado 38913

Orden (m para obtener ayuda): t
Se ha seleccionado la partición 1
Código hexadecimal (escriba L para ver los códigos): 8e
Se ha cambiado el tipo de sistema de la partición 1 por 8e (Linux LVM)

Orden (m para obtener ayuda): p

Disco /dev/sdb: 320.0 GB, 320072933376 bytes
255 heads, 63 sectors/track, 38913 cylinders
Units = cilindros of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000e0177

Disposit. Inicio Comienzo Fin Bloques Id Sistema
/dev/sdb1 1 38913 312568641 8e Linux LVM

Orden (m para obtener ayuda): w
¡Se ha modificado la tabla de particiones!

Llamando a ioctl() para volver a leer la tabla de particiones.
Se están sincronizando los discos.


Creamos el PV (PHISICAL VOLUME) y extendemos el VG

debian5:~# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created

debian5:~# vgextend debian5 /dev/sdb1
Attempt to close device '/dev/cdrom' which is not open.
Volume group "debian5" successfully extended

Miramos el espacio que ahora tenemos disponible en el VG debian5

debian5:~# vgs
VG #PV #LV #SN Attr VSize VFree
debian5 2 6 0 wz--n- 595,93G 575,26G


Creamos el LV events y le damos formato xfs

debian5:~# lvcreate -n events -L 575G debian5
Logical volume "events" created

debian5:~# mkfs.xfs /dev/debian5/events
Warning - device mapper device, but no dmsetup(8) found
Warning - device mapper device, but no dmsetup(8) found
meta-data=/dev/debian5/events isize=256 agcount=4, agsize=37683200 blks
= sectsz=512 attr=2
data = bsize=4096 blocks=150732800, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096
log =internal log bsize=4096 blocks=32768, version=2
= sectsz=512 sunit=0 blks, lazy-count=0
realtime =none extsz=4096 blocks=0, rtextents=0


Creamos el punto de montaje para este lv y agregamos la entrada al fstab

debian5:~# mkdir -p /events
debian5:~# vim /etc/fstab

Importante: Tener siempre en cuenta cuando se modifica el archivo fstab como es la jerarquia de los directorios y como los montará.
Por ejemplo: este es el archivo fstab actual

# /etc/fstab: static file system information.
#
#
proc /proc proc defaults 0 0
/dev/mapper/debian5-root / ext3 errors=remount-ro 0 1
/dev/sda1 /boot ext2 defaults 0 2
/dev/mapper/debian5-home /home ext3 defaults 0 2
/dev/mapper/debian5-events /events xfs defaults 0 2
/dev/mapper/debian5-tmp /tmp ext3 defaults 0 2
/dev/mapper/debian5-usr /usr ext3 defaults 0 2
/dev/mapper/debian5-var /var ext3 defaults 0 2
/dev/mapper/debian5-swap_1 none swap sw 0 0
/dev/hda /media/cdrom0 udf,iso9660 user,noauto 0 0

Si el punto de montaje para el LV "events" sería /var/events en vez de /events, este archivo produciría un error al querer montar el LV events, ya que intentaría montar un lv en /var/events cuando aún no montó /var. Por eso es que siempre deben tener en cuenta el orden en que va montando.



Por último
Probamos nuevamente con mount -a y luego vemos los FS montados con el comando df

debian5:~# mount -a
debian5:~# df
S.ficheros Bloques de 1K Usado Dispon Uso% Montado en
/dev/mapper/debian5-root
329233 82640 229595 27% /
tmpfs 972976 0 972976 0% /lib/init/rw
udev 10240 676 9564 7% /dev
tmpfs 972976 0 972976 0% /dev/shm
/dev/sda1 233335 16379 204508 8% /boot
/dev/mapper/debian5-tmp
376807 10289 347062 3% /tmp
/dev/mapper/debian5-usr
4805760 400164 4161476 9% /usr
/dev/mapper/debian5-var
2882592 274256 2461904 11% /var
/dev/mapper/debian5-home
10321208 154232 9642688 2% /home
/dev/mapper/debian5-events
602800128 4256 602795872 1% /events


pepo.

jueves, 1 de octubre de 2009

Para las familias geeks...

Creo que el video habla por si mismo, el poder de bash!!!!




pepo

martes, 29 de septiembre de 2009

Radio, Radio y más radio...

La radio para mi es indispensable cuando estoy haciendo cosas, y como por lo general paso gran parte del día frente a una pc, escucho la radio por internet.
Ya hace un tiempo que tengo el lema de que todo lo que se pueda hacer por consola, se debe hacer desde una (o sea todo!). Por eso para escuchar la radio, o cualquier archivo de audio, uso el mplayer (es mágico). Ahora, como de vez en cuando, por problemas de conectividad, se cortaba y tenía que volver a correr el comando, o en horas picos no se conectaba de una y tenía que andar reintentando hasta conectarme. Por este motivo me hice este pequeño script que usa un bucle al infinito para conectarse (en este caso a la rock and pop)


[pepo@bernard ~]$ cat $(which RandP)
#!/bin/bash
cont=0
while true; do mplayer http://streaming.fmrockandpop.com/rockandpop; cont=$(cont+=cont); echo $cont; done

Basicamente usa un while, infinito, para conectarse con mplayer al link de streaming de la rock and pop.

pepo

viernes, 25 de septiembre de 2009

Haciendo las cosas más simples con ssh

bueno, esto es algo práctico y simple para todos lo que como yo tienen un usuario en su linux diferente al que usar para otros equipos. En mi caso tengo un usuario para mi desktop y otro para los servidores en los cuales trabajo, por lo que cuando me conecto por ssh debo especificar ese usuario (con el opción "-l" o de la forma clásica user@host).
Para evitar siempre escribir el usuario, simplemente hay que crear primero el directorio .ssh y luego el archivo el siguiente archivo:


pepo@frank:~$vim /home/pepo/.ssh/config

Que tiene el siguiente formato:

Host *

user



En donde se pueden especificar los host y el user para cada uno.

jueves, 24 de septiembre de 2009

Si no chequeo el FileSystem HAY TABLA!

A veces nos topamos con un "problema" que aunque a primera vista parece complejo, tiene un solución simple, basicamente porque la raíz del problema que "atacamos" es otra.
Por esto, y para los que alguna vez les paso, nunca hay que olvidar de primero verificar el file system de su Linux, ya que más de una vez me he dado la cabeza contra la pared intentando solucionar algo y resultó que el problema era un file system lleno.
Por eso, como regla, siempre correr:



pepo@frank:~$ df -h

S.ficheros Tamaño Usado Disp Uso% Montado en

/dev/sda2 15G 13G 1,3G 91% /

varrun 378M 292K 378M 1% /var/run

varlock 378M 0 378M 0% /var/lock

udev 378M 48K 378M 1% /dev

devshm 378M 76K 378M 1% /dev/shm

lrm 378M 39M 339M 11% /lib/modules/2.6.24-23-generic/volatile

/dev/sda1 45G 24G 21G 54% /media/hda1



Y luego de chequearlo seguir adelante.

miércoles, 23 de septiembre de 2009

Afinidad de los procesos

Cambiar la afinidad (el cpu donde corre) un proceso, es algo que en algún momento podríamos necesitar. Como ya me ha pasado de necesitarlo aca va como hacerlo.
En GNU/Linux tenemos el comando taskset (se encuentra el paquete schedutils) por lo que si no lo tenemos los debemos instalar primero

Debian/Ubuntu)





# apt-get install schedutils

RHEL/Fedora)






# yum install schedutils

Una vez instalado basicamente debemos buscar el PID (process ID) al cual le queremos cambiar la afinidad, el comando ps auxf es el candidato para ello, y una vez obtenido podremos ver la afinidad y si queremos luego cambiarla de la siguiente forma:


En mi caso tengo un procedor dual core, y el proceso elegido para cambiar la afinidad es el demonio sshd que por default corre en ambos procesadores



Busco el pid:

pepo@luca:~$ ps ax |grep sshd|grep -v grep
 5459 ?        Ss     0:00 /usr/sbin/sshd 

Verifico la afinidad:

pepo@luca:~$ taskset -pc 5459
pid 5459's current affinity list: 0,1

Cambio la afinidad:

pepo@luca:~$ sudo taskset -pc 0 5459
pid 5459's current affinity list: 0,1
pid 5459's new affinity list: 0

Y con esto ya el demonio sshd só:lo corre en el core 0 :D

martes, 22 de septiembre de 2009

Particionando discos desatendidamente....

La mágia de la virtualización me llevo a tener que rebuscarmelas para particionar un disco de forma desatendida, cuando el equipo levanta y sólo la primera vez que levanta la vm (virtual machine), luego de googlear un poco (y gracias a algunos links que me pasaron :D ), logre realizar lo que necesitaba con el siguiente script.

#!/bin/bash

function valid {

if [ $? -eq 0 ];then
return 0
else
exit 1
fi

}

function clean {

#borro links simbolicos y archivo

rm -f /etc/init.d/start_up.sh
rm -f /etc/rc[2-5].d/S15start_up.sh

}

hdc=$(fdisk -l /dev/hdc |grep GB|awk -F"," '{print $2}'|awk '{print $1}')
let hdc_mb=$hdc/1048576
valid
#echo "espacio de particion" $hdc_mb
echo -e "n\np\n1\n\n+${hdc_mb}M\nt\n83\n\np\nw\n" | fdisk /dev/hdc
valid
mkfs.ext3 -q /dev/hdc1
valid
echo "/dev/hdc1 /opt ext3 defaults 0 1" >> /etc/fstab
valid
mount -a
valid
echo "particionamiento ok"
clean


En resumen, siempre mi disco nuevo a particionar era hdc, por eso lo primero que hago es obtener su tamaño en MB , luego uso una tuberia (pipe) para alimentar a fdisk de los comandos necesarios para crear una nueva partición primaria del tamaño total del disco.
Esto es la línea:

echo -e "n\np\n1\n\n+${hdc_mb}M\nt\n83\n\np\nw\n" | fdisk /dev/hdc

Que le pasa:
"n" -- Nueva partición
"\n" -- Enter
"p" -- Partición primaria
"\n" -- Enter
"1" -- Número de la partición
"\n" -- Enter
"\n" -- Enter (en este paso es donde pregunta desde que cilindro del disco, aceptamos el default )
+${hdc_mb}M -- Tamaño en MB
"\n" -- Enter
"t" -- Tipo de partición
"\n" -- Enter
"83" -- Tipo Linux
"\n" -- Enter
"\n" -- Enter
"p" -- Para imprimir la tabla de particiones
"\n" -- Enter
"w" -- Para escribir la tabla de particiones en el disco
"\n" -- Enter


Una vez realizado esto, sólo nos resta darle FS (mkfs.ext3) y agregar la entrada en fstab para que la monte de forma automática cuando se inicie el equipo.

Para finalizar, habrí que copiar este script en /etc/init.d y crear el script de inicio S* para que corra cuando levante el run level configurado.
Esto seria algo como:

Debian)

correr #update-rc.d start_up.sh start 15 2 3 4 5 .

RHEL/Fedora)
crear link simbólico

# for i in 2 3 4 5;do ln -s /etc/init.d/start_up.sh /etc/rc${i}.d/S15start_up.sh;done





En fin, con todo este procedimiento obtuve lo que necesitaba :D

pepo.

jueves, 10 de septiembre de 2009

lesson learned...

Cosas del día a día

Por diferentes motivos día a día van surgiendo pequeñas "cosas" u obstáculos que solucionar, la idea de este blog es ir documentandolos para ser una fuente de consulta confiable.

Dicho esté preambulo, ahí va el primero de lo que espero que sea una larga serie :)

Consultar una base de datos Oracle con perl sin usar el módulo DBI

Bueno, si bien perl nos probee el modulo DBI para servir de API contra diferentes tipos de bases de datos (Oracle, MySQL, etc), hace poco me encontré con el problema que algunos de los comandos nativos de PL/SQL (Oracle) no los tomaba la API por lo cual no podía utilizarla.
Puntualmente necesitaba conectarme a la base, activar la función timing (para saber cuanto tiempo necesito la consulta), obtener el resultado y luego desactivar la función timing y cerrar la conexión.
La función timing se habilita con la sentencia:

set timing on

La cual me producía un error utilizando DBI, por lo que luego de navegar un poco encontré la siguiente forma de hacerlo:


#!/usr/bin/perl -w



open ORA, "| $ORACLE_HOME/bin/sqlplus /\@" or die "Can't pipe to sqlplus: $!";

print ORA "set timing on\n";

print ORA ";\n";

print ORA "set timing off\n";

print ORA "exit\n";

close ORA;



Con este pequeño script pude obtener la salida necesaria para saber cual era el tiempo que tardaba en ejecutarse mi query :D

martes, 4 de agosto de 2009

1er post...

Bueno la gente que me conoce sabe que no seria mi primer post si no empezaria por este tema:
Numeros primos:
Este es un pequeño script que busca, estos numeros tan caracteristicos, esta hecho en perl (va a haber muchas cosas hechas en perl en este bolg)

perl -e'$q=2;$i=2;until(2==3){$i++;if($i%2==0){next}$p=$i-1;$a= 3;for($a;$a<$i;$a++){if ($a==$p){$q++;print"$i PRIMO - $q\n";last}elsif($a%2==0){next}elsif($i%$a==0){last}}}'

Saludos