Los zombis también pueden estar en el NSLU2

Un proceso zombi es un proceso que ha completado su ejecución pero aun tiene una entrada en la tabla de procesos. Esta entrada aun es necesitada para permitir la lectura del estado de su estado de salida. El Termino zombi se deriva de la definición de un muerto viviente (se acuerdan de esa película?). Para ponerlo en términos simples y un poco mas técnicos, un proceso hijo ha terminado pero aun no se ha eliminado de la tabla de procesos y el comando kill no tiene efectos sobre él.

Identificarlos es fácil, podemos ejecutar el comando ps y buscamos cuales procesos tienen una "z" en la columna "STAT". Los procesos zombi que permanecen por un periodo mas que corto por lo general es señal de un Bug en el proceso padre. Ahora bien, si el zombi aun existe después de que el proceso padre ha terminado esto por lo general indica un bug en el sistema operativo.

[caption id="attachment_231" align="aligncenter" width="700" caption="La salida de el comando top que muestra donde están los zombis"]La salida de el comando TOP que muestra donde estan los zombis[/caption]

Un procesos zombi no es un problema tan grave, el problema se agrava si el computador va a ser sometido a fuertes cargas pues puede ser que se multipliquen. A pesar de que los zombis no consumen memoria un incremento acelerado de estos podría traer consecuencias a la hora de que el sistema operativo se le acaben los PID a asignar.

Una vez que el padre haya matado el zombi el proceso ID (PID) y la entrada en la tabla de procesos puede ser reutilizada, pero si este falla, el zombi permanece en la tabla de procesos.

Para eliminar un zombi del sistema, se le debe enviar la señal SIGCHLD al padre usando el comando kill. En caso de que el padre se no pueda eliminar el zombi de la tabla de procesos podríamos intentar matando el proceso padre. Algo que debemos tomar en cuenta es que cuando un proceso pierde a su padre, 'init' pasar a ser su nuevo padre y este se encarga de limpiar periódicamente la tabla de procesos de los zombis cuyos padres sean init.

Desde hace un par de años me llamo la atención como se colaron a internet los correos electrónicos de miles de internautas afectos al actual gobierno venezolano. Revisando los comentarios y usando google me pude dar cuenta que la fuente podría ser alguna comunidad web (foro) orientada específicamente a usuarios oficialistas, no veo otra forma de asociar una dirección de correo electrónica con una tendencia política.

Para duplicar estos resultados escribí un script que permite obtener estos emails y se adapta a cualquier comunidad que use phpBB como software para foros. echemos un vistazo.

TEMP_URL="/tmp/spider_url.tmp"
MAX_SLEEP=1
TMP_EMAILS="/tmp/spider_emails.tmp"
CONFIG=$1 EMAIL_OUTPUT="/tmp/emails.txt"

rm -f $TEMP_URL
rm -f $TMP_EMAILS
rm -f $EMAIL_OUTPUT

for COMUNIDAD in `cat $CONFIG`
  do COMUNIDAD_URL=`echo $COMUNIDAD | awk -F, '{print $1}'`
  PERFILMIN=`echo $COMUNIDAD | awk -F, '{print $2}'`
  PERFILMAX=`echo $COMUNIDAD | awk -F, '{print $3}'`
  PERFIL=$PERFILMIN
  while [ "$PERFIL" -lt "$PERFILMAX" ]
    do echo "http://$COMUNIDAD_URL/profile.php?mode=viewprofile&u="$PERFIL
    PERFIL=`expr $PERFIL + 1`
  done
done | sort -R | grep -i [a-z] >> $TEMP_URL

for URL_DE_PERFIL in `cat $TEMP_URL`
  do curl -s --referer `shuf -n1 $TEMP_URL` $URL_DE_PERFIL | grep -i "@" |\
  sed -e 's/</ /g' -e 's/>/ /g' -e 's/\:/ /g' -e 's/\=/ /g' -e 's/&amp;/ /g' |\
  sed s/\"/\ /g |\ tr ' ' '\n' | \ grep "@" | sort | uniq | tr 'A-Z' 'a-z'
  SEGUNDOS=$[ ( $RANDOM % $MAX_SLEEP )  + 1 ]
  sleep $SEGUNDOS
done >> $TMP_EMAILS cat `echo $TMP_EMAILS` |\
grep -i -E '[a-zA-Z0-9_]*@[a-zA-Z0-9]*\.*\.(com|edu|net|org|info|ve)' | sort |\
 uniq > $EMAIL_OUTPUT

El script toma información que es publica y la filtra hasta obtener una cadena que semejé una dirección de correo electrónico, como pueden ver en las siguientes imagenes el perfil de los usuarios son públicos y es predecible cual es la URL de estos perfiles ya que son numerados de forma secuencial.



Al ejecutar el script no arroja ninguna salida, tendríamos que hacer un cat a $EMAIL_OUTPUT como lo vemos aquí:

Desde hace un par de años me llamo la atención como se colaron a internet los correos electrónicos de miles de internautas afectos al actual gobierno venezolano, revisando los comentarios y usando google me pude dar cuenta que la fuente podría ser alguna comunidad web (foro) orientada específicamente a usuarios oficialistas, no veo otra forma de asociar una dirección de correo electrónica con una tendencia política

Si se fijan el el script el recibe un parámetro cuando lo ejecutamos, ese parámetro es la ruta a un archivo que va a contener la información de la URL del foro a escanear, el primer perfil a escanear y el ultimo perfil, todo separado por comas sin espacios en blanco (comunidad,minimo,maximo) el archivo se vería algo así:

www.noticierodigital.com/forum,1001,1010 aporrealos.com/forum,1000,1020

Para llegar a cual es el perfil numero del perfil del ultimo usuario registrado por demos jugar en nuestro navegador web con el parámetro u=17015 y cambiar ese numero por uno mas alto hasta que recibamos una pantalla de error del foro diciendo que ese perfil no existe.

Se puede asociar el perfil con el nick y por ende con el email.

Evitando Patrones. Si volvemos al script que publique, pueden ver que tome algunas medidas para evitar crear patrones el archivos de registro (log files) alterando el orden de los perfiles y cambiando aleatoriamente el tiempo a esperar entre visita y visita a los perfiles adicionalmente estoy enviando un 'referrer' perteneciente a estas comunidades con cada petición HTTP.

El producto final de este script es una lista de direcciones de correo, una dirección por linea y luce así:

ferminmittilo@gmail.com
ivanmarcanolopez@hotmail.com
jjguillen@cantv.net
monje902@hotmail.com
psichofra@hotmail.com
linux@hacks.org

Este script no funciona con todos los foros phpBB, algunos requieren una sesión valida para acedar la pagina de los perfiles. En la segunda parte de este script (que publicare en los próximos días) usare este mismo script pero implementando cookies, sesiones, proxies y recurriendo a la cache de algunos buscadores web.


UPDATE: El script corre sin problemas en el iPhone asi que se puede ejecutar desde cualquier parte que se tenga internet bien sea vía Edge, 3G o WIFI.

Aquí una captura de pantalla y un video de el script con algunas modificaciones después de ejecutarse:

Script para recolectar emails de foros web ejecutado desde el iPhone

Hace poco me consultaron si se podía limitar el espacio de una carpeta Samba (samba share) sin tener control de usuarios es decir hay una carpeta por usuario que esta a su vez es 'mapeada' a su estación de trabajo (que corre windows) pero todos los usuarios usan el mismo usuario y el mismo password para acceder cada una de sus carpetas. La pregunta me dejo cabezón, yo nunca trabaje con Samba pero se que debe de haber forma de hacer esto. Por ahora me dispuse a crear un script que le ayudara.

Limitar el espacio de una carpeta sin usar cuotas en Samba

El script lee un archivo de texto separado por comas el cual tiene dos columnas una para el nombre del usuario y la cantidad de Megabytes que se le va a asignar a cada usuario. Usando el comando dd el script crear archivos que son formateados como EXT3 y seguidamente los monta. El archivo de texto plano luce así:

cat /tmp/usuarios.txt

maria.perez,5
arnaldo.hernandez,5
gustavo.flores,10
jesus.boss,5
marta.hernandez,5
wilkneman.pascoski,5
tatiana.siu,5
alexandra.delarosa,5

Aparte de crear, formatear y montar estos archivos el script también crea la configuración base que se le va a anexar a al smb.conf con el siguiente formato para cada usuario:

[alexandra.delarosa]
   comment = alexandra.delarosa with 5MB
   path = /mnt/smb_discs/alexandra.delarosa
   read only = no
   browseable = yes
   guest ok = yes

[arnaldo.hernandez]
   comment = arnaldo.hernandez with 5MB
   path = /mnt/smb_discs/arnaldo.hernandez
   read only = no
   browseable = yes
   guest ok = yes


[gustavo.flores]
   comment = gustavo.flores with 10MB
   path = /mnt/smb_discs/gustavo.flores
   read only = no
   browseable = yes
   guest ok = yes

Luego seria cuestión de retocar el /etc/Samba/smb.conf y reiniciar el servicio, re-mapear esto Samba share a los usuarios y listo. Aquí esta el script

LISTAUSUARIOS=`cat /tmp/usuarios.txt|sort`
RUTA_DISCOS="/smb_disks/smb_drives"
MOUNT_SMB="/mnt/smb_discs"
TMPSAMBACONF="/tmp/samba.virt.conf"

echo > $TMPSAMBACONF
mkdir -p `echo $RUTA_DISCOS`

for X in $LISTAUSUARIOS
  do echo $X | awk -F , '{print "asignando " $2 "MB a usuario "$1}'
  USUARIO=`echo $X | awk -F , '{print $1}'`
  PRE_ESPACIO=`echo $X | awk -F , '{print $2}'`
  let ESPACIO=`echo $PRE_ESPACIO`*1024
  dd if=/dev/zero of=$RUTA_DISCOS/$USUARIO.img bs=1024
  count=$ESPACIO
  /sbin/mke2fs -L $USUARIO -j $RUTA_DISCOS/$USUARIO.img
  mkdir -p $MOUNT_SMB/$USUARIO
  mount -t ext3 $RUTA_DISCOS/$USUARIO.img -o loop $MOUNT_SMB/$USUARIO
  echo "[$USUARIO]
  comment = `echo $USUARIO" with "$PRE_ESPACIO"MB"`
  path = /mnt/smb_discs/$USUARIO
  read only = no
  browseable = yes
  guest ok = yes    " >> $TMPSAMBACONF
done

echo "espacio usado en $RUTA_DISCOS: "
du -smh $RUTA_DISCOS/*.img
du -smh $RUTA_DISCOS/
mount -l | grep $MOUNT_SMB
echo "CHECK $TMPSAMBACONF AND ADD IT TO YOUR /etc/samba/smb.conf"

Como mencione anteriormente, yo nunca he trabajado con Samba en ambiente de producción yo practique o jugué un poco con Samba hace unos 5 años. este script no incluye configuraciones para estos Samba shares que proporcionen algo de seguridad. Si alguien tiene sugerencias pueden dejarlas en los comentarios.

Si experimentas problemas con el tamaño de estos discos virtuales no dudes en darle un vistazo a este articulo: El limite para 32-bits es de2147483647.

Este script es cumple la misma función que el anterior de Flickr pero con los albums web de Picasa. Solo necesita que uno le pase como parametro la URL de el album que uno desea, por ejemplo http://picasaweb.google.com/orvtech/Hdd

Este seria el código del script:

#!/bin/bash SIZE=400 echo $1 | \ curl -s žawk --field-separator=/ '{print "http://picasaweb.google.com/data/feed/api/user/"$4"/album/"$5}'ž |\ sed -e 's/\"/\ /g' -e s/\'/\ /g |\ tr ' ' '\n' |\ grep  s72 |\ awk '{print "[url='$1'][img]"$0"[/img][/url]\n"}' |\ sed s/s72/s$SIZE/g

Asumiendo que es script se llama Picasa2BBCode.sh podemos ejecutarlo así:

sh Picasa2BBCode.sh http://picasaweb.google.com/orvtech/Hdd

De este script podemos modificar el valor de $SIZE, los valores permitidos son 72px, 144px, 288px, 320px, 400px, 512px, 576px, 640px, 800px y 1024px pero si las fotos están en resolución menor a 800 puede que de problemas. El producto de este script seria algo así:

[url=http://picasaweb.google.com/orvtech/Hdd#][img]http://lh6.ggpht.com/_WwtoUQV8M_8/S5kBtkqKAdI/AAAAAAAAPbM/I0LCPdB-qpQ/s400/IMG_7457.JPG[/img][/url]
[url=http://picasaweb.google.com/orvtech/Hdd#][img]http://lh3.ggpht.com/_WwtoUQV8M_8/S5kBtwXW08I/AAAAAAAAPbQ/Y636HBHOxEo/s400/IMG_7458.JPG[/img][/url]
[url=http://picasaweb.google.com/orvtech/Hdd#][img]http://lh5.ggpht.com/_WwtoUQV8M_8/S5kBtzPQLrI/AAAAAAAAPbU/ZOWfnh4uGuA/s400/IMG_7459.JPG[/img][/url]
[url=http://picasaweb.google.com/orvtech/Hdd#][img]http://lh5.ggpht.com/_WwtoUQV8M_8/S5kBuJEzUPI/AAAAAAAAPbY/qxTGuFR_EbA/s400/IMG_7461.JPG[/img][/url]
[url=http://picasaweb.google.com/orvtech/Hdd#][img]http://lh3.ggpht.com/_WwtoUQV8M_8/S5kBupiHjqI/AAAAAAAAPbc/FShn8ryEr54/s400/IMG_7462.JPG[/img][/url]
[url=http://picasaweb.google.com/orvtech/Hdd#][img]http://lh5.ggpht.com/_WwtoUQV8M_8/S5kCW9ags7I/AAAAAAAAPbw/wFYET5XlgkQ/s400/IMG_7463.JPG[/img][/url]
[url=http://picasaweb.google.com/orvtech/Hdd#][img]http://lh5.ggpht.com/_WwtoUQV8M_8/S5kCXA_XujI/AAAAAAAAPb0/WDc3N1tLDCw/s400/IMG_7464.JPG[/img][/url]
[url=http://picasaweb.google.com/orvtech/Hdd#][img]http://lh4.ggpht.com/_WwtoUQV8M_8/S5kCXDnyhkI/AAAAAAAAPb4/SWuagR3LA8c/s400/IMG_7465.JPG[/img][/url]
[url=http://picasaweb.google.com/orvtech/Hdd#][img]http://lh5.ggpht.com/_WwtoUQV8M_8/S5kCXTt6vaI/AAAAAAAAPb8/i1RmMrL5slg/s400/IMG_7466.JPG[/img][/url]
[url=http://picasaweb.google.com/orvtech/Hdd#][img]http://lh5.ggpht.com/_WwtoUQV8M_8/S5kCX8hUk-I/AAAAAAAAPcA/YzOe_0bO0Jw/s400/IMG_7468.JPG[/img][/url]
...

Luego podemos pegar ese código en el foro en el que queramos compartir nuestras imágenes.

Como buen troll que soy me mantengo entretenido y participo en varias comunidades o foros en internet. siempre quise mantener mi firma apuntando a mi ultimo articulo publicado pero al mismo tiempo me da flojera actualizar todos esos foros cada vez que publico algo nuevo.

Ya que tengo corriendo apache en mi NSLU2 decidí crear un script que me cree un archivo .htaccess y así redirigir una petición HTTP en especifico a mi ultima publicación en mi blog. Para esto he decidido crear un sub-directorio en mi RootDirectory llamado '/latest'

mkdir /var/www/linuxevolution.org/htdocs/latest mkdir /var/www/orvtech.com/htdocs/latest

El script hace un poco mas que simplemente crear el htaccess. Me permite especificar cuales VirtualHost corriendo NanoBlogger quiero usar, creando un .htaccess para cada uno de estos como se puede ver aquí:

#!/bin/bash DocummentRoot="/var/www/linuxevolution.org/htdocs /var/www/orvtech.com/htdocs"' for virtualhost in $DocummentRoot do cat $virtualhost/rss.xml  | grep link | grep archives |\ head -n1 | sed -e :a -e 's/<[^>]*>//g;/</N;//ba' |\ awk '{print "RewriteEngine on\nRewriteRule (.*) "$0" [R=301,L]"}' > $virtualhost/latest/.htaccess done

En mi caso tengo 2 blogs que usan NanoBlogger y este script mantiene el directorio '/latest/' apuntando a la ultima publicación en cada uno (www.linuxevolution.org/latest la versión en ingles de este sitio y orvtech.com/latest que seria la entrada mas reciente de este blog).