Espacios en for i in $(ls)

#!/bin/sh

IFS=$'\x0A'$'\x0D' ;
for i in $(find -iname "*.avi"); do
mv -v "$i" . ;
done;

Chuleta:  Para que el for no considere el espacio un separador, y una tarea como la del ejemplo lo realize bien. El script de ejemplo mueve todos los videos de subcarpetas al directorio actual.

Script para hacer copias de seguridad incrementales

Actualizado : lunes, 09 de febrero de 2009
Hoy público en script que tenía hace tiempo funcionando pero muy mal estructurado, hoy he estado puliendolo y creo que esta suficientemente presentable como para publicarlo. Esta basado en bash (no es necesario python para nada) y la idea es poder hacer copias incrementales de la forma más fácil posible. (sin parametros o pocos parametros con buenos valores por defecto).

El script se puede ejecutar con 0, 1 o 2 parametros:

  • 0 parametros : si simplemente ejecutamos el script, sin parametros, considerará que quieres hacer una copia de seguridad del directorio de trabajo actual. Si el directorio activo es por ejemplo: /home/makiolo/descargas se creara el directorio copia_de_descargas con la copia principal y las copias incrementales.
  • 1 parametros : si no queremos especificar el directorio que queremos salvar de forma implicita (por directorio de trabajo), sencillamente pasamos la ruta del directorio que queremos salvar(absoluta o relativa) como primer parametro. Se creara en el mismo directorio que queremos salvar la carpeta copia_de_$nombre con la copia principal y las copias incrementales. Como he dicho las rutas pueden ser relativas o absolutas, pero es recomendable las absolutas pero definitivamente evitar el determinismo del directorio de trabajo.
  • 2 parametros : Tener la copia de seguridad junto original no es muy útil si sufrimos una perdida de información. Es evidentemente recomendable tener la copia en un disco distinto al original. Por tanto:
    • 1er parametro : carpeta que queremos salvar.
    • 2º parametro : destino de la copia de seguridad
  • Alguna cosas más importantes:
    • .rsyncExcluir : se hace un listado de directorios y archivos que se excluyen de la copia de seguridad. Si no existe se crea excluyendo a si mismo y al destino de la copia de seguridad. Para evitar hacer una copia de la copia :/
    • En copia_de_$nombre/principal/ : Esta es la copia más reciente, y si ejecutas tu comando con cierta frecuencia es una copia exacta del original.
    • En copia_de_$nombre/incrementales/ : Se crea un incremental por día, (excepto si en ese día no hubo cambios). Tal y como esto en AÑO-MES-DIA, no sería dificil cambiar el date para realizar otro tipo de partición. Si especificamos hora y minuto podría ser excesivamente particionado. Podríamos cambiar el script para agrupar por otros criterios, por ejemplo fecha+turno (grupo de mañana o de tarde), o por numero de la semana si las copias de seguridad son semanales. En los incrementos solo se guarda el cambio respecto al principal que se hizo ese día.
  • Asi que simplemente hacer gedit copiaSeguridad , copy & paste  y darle permisos.
#!/bin/sh
#
# :: Invasion Tux
# :: Ultima modificacion : lunes, 09 de febrero de 2009
# :: Script realizado por makiolo (makiolo@gmail.com)  (Licencia Creative Commons con reconocimiento)
# :: Ultima version : https://blogricardo.wordpress.com/2009/02/08/script-para-hacer-copias-de-seguridad-incrementales
# :: Dependencias : rsync
#

################################# VARIABLES ##############################################

if [ $# -eq 0 ]; then
	# Directorio que queremos salvar
	DIRECTORIO_A_SALVAR=`pwd`

	# construir nombre subdirectorio
	NOMBRE_MES_ANIO=`date +"el_mes_%m_del_%Y"`
	NOMBRE_SALVADO=`basename $DIRECTORIO_A_SALVAR`
	SUB_DIRECTORIO_A_SALVAR="copia_de_"$NOMBRE_SALVADO"_en_"$NOMBRE_MES_ANIO

	# directorio donde se guarda el backup
	DESTINO_DE_LA_COPIA=$DIRECTORIO_A_SALVAR/$SUB_DIRECTORIO_A_SALVAR
elif [ $# -eq 1 ]; then
	# Directorio que queremos salvar
	DIRECTORIO_A_SALVAR=$1

	# construir nombre subdirectorio
	NOMBRE_MES_ANIO=`date +"el_mes_%m_del_%Y"`
	NOMBRE_SALVADO=`basename $DIRECTORIO_A_SALVAR`
	SUB_DIRECTORIO_A_SALVAR="copia_de_"$NOMBRE_SALVADO"_en_"$NOMBRE_MES_ANIO

	# directorio donde se guarda el backup
	DESTINO_DE_LA_COPIA=$DIRECTORIO_A_SALVAR/$SUB_DIRECTORIO_A_SALVAR
elif [ $# -eq 2 ]; then
	# Directorio que queremos salvar
	DIRECTORIO_A_SALVAR=$1

	# construir nombre subdirectorio
	NOMBRE_MES_ANIO=`date +"el_mes_%m_del_%Y"`
	NOMBRE_SALVADO=`basename $DIRECTORIO_A_SALVAR`
	SUB_DIRECTORIO_A_SALVAR="copia_de_"$NOMBRE_SALVADO"_en_"$NOMBRE_MES_ANIO

	# directorio donde se guarda el backup
	DESTINO_DE_LA_COPIA=$2/$SUB_DIRECTORIO_A_SALVAR
else
	echo "Numero de parametros incorrecto"
	exit
fi

# Archivos donde listamos las exlusiones de la backup
FICHERO_DE_EXCLUSION=$DIRECTORIO_A_SALVAR/.rsyncExcluir

# subdirectorio donde se guarda la copia principal
COPIA_PRINCIPAL=$DESTINO_DE_LA_COPIA/principal

# subdirectorios donde se guardan las copias incrementales
COPIA_INCREMENTOS=$DESTINO_DE_LA_COPIA/incrementales

# ruta variable de copias incrementales
COPIA_INCREMENTOS_VARIABLE=$COPIA_INCREMENTOS/`date | awk '{print $3}'`

# opciones de rsync , mejor no tocar
OPCIONES="--force --ignore-errors --delete --delete-excluded \
 --exclude-from=$FICHERO_DE_EXCLUSION --backup --backup-dir=$COPIA_INCREMENTOS_VARIABLE -av"

################################# FUNCIONES ##############################################
ejecutarRsync()
{
	if [ ! -f $FICHERO_DE_EXCLUSION ]; then
		echo `basename $DESTINO_DE_LA_COPIA`"/" > $FICHERO_DE_EXCLUSION
		echo ".rsyncExcluir" >> $FICHERO_DE_EXCLUSION
		echo "*~" >> $FICHERO_DE_EXCLUSION
	fi
	rsync $OPCIONES $DIRECTORIO_A_SALVAR $COPIA_PRINCIPAL
}

################################# MAIN ##############################################

# nos aseguramos de que existen los directorio de destino de la copia de seguridad
mkdir -p $DESTINO_DE_LA_COPIA
mkdir -p $COPIA_PRINCIPAL
mkdir -p $COPIA_INCREMENTOS

if [ ! -d $DIRECTORIO_A_SALVAR ]; then
	echo "No se encontro el directorio a salvar : $DIRECTORIO_A_SALVAR";
elif [ ! -d $DESTINO_DE_LA_COPIA ]; then
	echo "No se encontro el directorio de destino de la copia : $DESTINO_DE_LA_COPIA";
else
	ejecutarRsync
fi

Es un script excelente para combinarlo con un cron 24h.

Si no entendeis para que sirve el script o no sabeis que es una copia incremental –> google xD, no hombre podeis preguntarmelo y eso xD

Tambien si encontrais algún bug os lo agradeceré mucho que lo comenteis.

Freeze en linux

Aunque es improbable que ocurra un cuelgue en Linux puede ocurrir por varios motivos.
Los programas pueden ejecutarse en el espacio de usuario(con restricción de instrucciones) o en espacio del sistema (acceso total a todo el conjunto de instrucciones).
A diferencia de windows(un cuelgue de calculadora te podría matar el sistema) un cuelgue es el espacio de usuario no cuelga el sistema aunque puede hacerte estragos, especialmente si consume el 100% de la CPU, a pesar de estar en el espacio de usuario.
Cuando un proceso en el espacio de usuario se comporta erráticamente y es proceso “manifestado” en una ventana usaremos “forzar el cierre” o simplemente cerramos y GNOME debería proponer un forzar cierre. Si esto no nos sirve ya sea por que no cierra o es un proceso oculto, nos iremos a un terminal con la combinación CTRL + ALT + F1, y desde hay con los comandos: ps aux, kill -9, killall o htop solucionamos el problema, también es útil saber que estando en GNOME con la conbinación CTRL + ALT + BACKSPACE mata e inicia GNOME.

Bueno hasta aqui, no creo a ver dicho nada nuevo para la mayoría. En linux los únicos programas que se ejecutan con todas las instrucciones de ensamblador disponibles son: El kernel de linux y sus modulos adjuntos a este. Sólo estos dos podrían generar un freeze , incluidos el módulo de por ejemplo el virtualbox. Por tanto si hemos recibido algún freeze total(solo soluciona el reinicio) debemos revisar nuevos modulos que hayamos instalado, especialmente los modulos de propietarios que son los que más bugs suelen traer debido a que es dificil integrar una caja negra en un sistema que destaca por su transparencia.

No obstante si alguna vez nos pasara un freeze total, deberiamos realizar lo siguiente en lugar de reiniciar:

Pulsamos las teclas ALT y la de “Imprimir pantalla”, y sin soltar el ALT, el Imprimir pantalla si puedes soltarlo, vamos escribiendo letra a letra REISUB (os podeis formar una memotecnia fácil con REI y SUB, prefiero no decir la mía : D). Con esto logramos reiniciar nuestro sistema de manera segura ya que según vamos pulsando las teclas vamos mandando una orden a nuestro sistema, tales como:

R.- Devuelve el control al teclado (Raw)
E.- Manda todos los procesos al term, es decir, los hace terminar (End)
I.– Manda los procesos al Kill, es decir, los mata.
S.- Sincroniza el disco duro (Sync)
U.- Desmonta todos los sistemas de ficheros (Unmount)
B.- Por último, reinicia el ordenador. (reBoot)

Otra forma que en lugar de reiniciar, lo deja apagado sería en lugar de REISUB, el combo mágico sería REISUO

Fuentes :
http://en.wikipedia.org/wiki/Magic_SysRq_key
http://www.esdebian.org/foro/25034/reisub-yo-que-quiero-apagar

Conky : El monitor del sistema más versatil

conkyConky es un software libre para monitorear el estado de sistemas basados en linux. Lo mejor es de conky es su gran versatilidad, dispone de su propio lenguaje de scripts, este script nos permite por ejemplo mostrar la salida de un comando cada cierto tiempo. Por ejemplo tail -n 5 /var/log/messages , mostrar textos fijos, conky tiene una gran lista de variables predefinidas, podemos poner lineas, tablas, graficos y todo ello del color que queramos. Tenemos una innumerable lista de posibilidades, pero lo mejor para empezar es estudiar scripts que la comunidad pone a disposición, y siguiendo la filosofía de software libre mejorandolo y adaptandolo a nuestras necesidades, para despues volverle a poner a disposición de la comunidad. Siguiendo esta filosofía aqui os pongo mi .conkyrc. Para configurar vuestro conky igual que el mio, debeis escribir en consola: gedit ~/.conkyrc y pastear todo este script, despues seguimos los pasos que aparecen en la cabezera del script, debido a que tiene algunas dependencias que hay que instalar. Es fácil analizar la sintaxis y modificarlo a nuestras necesidades:

# Ultima actualización : domingo, 02 de noviembre de 2008
# Algunos trozos basadas en : http://ubuntuforums.org/showthread.php?t=281865&page=172
# Requiere : Hddtemp(como demonio) , lm-sensors y nvidia-settings
# Paso 1 : instalar hddtemp lm-sensors nvidia-settings
# Paso 2 : sudo sensors-detect le damos todo por defecto y en el ultimo paso decimos YES para añadir el modulo coretemp a /etc/modules
# Contacto : makiolo@gmail.com

background yes
use_xft yes
xftfont Terminus:size=8
out_to_console no
update_interval 3.0
total_run_times 0
own_window no
double_buffer yes
draw_shades no
draw_outline no
draw_borders no
stippled_borders 8
border_margin 12
border_width 1
default_color white
default_shade_color black
default_outline_color white
alignment top_right
maximum_width 270
own_window yes
own_window_type normal
own_window_transparent yes
own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager
gap_x 12
gap_y 24
no_buffers yes
uppercase no
cpu_avg_samples 2
net_avg_samples 2
override_utf8_locale yes
use_spacer none

TEXT
${color #000000}SISTEMA ${hr 2}${color}
${color #ddaa00}PC:${alignr} ${color}Linux Ubuntu, $nodename
${color #ddaa00}Kernel :${alignr}${color}$kernel
${color #ddaa00}Tiempo encendido:${alignr} ${color }$uptime
${color #000000}CARGA DEL SISTEMA ${hr 2}${color}
CPU 1 (${freq_g cpu0}Ghz): ${color #FF0000} ${color #ddaa00} ${cpu cpu1}% ${color #ff0000}${exec sensors | grep "Core 0" | cut -c15-17}$color °C ${color}${cpubar cpu1}
CPU 2 (${freq_g cpu1}Ghz): ${color #FF0000} ${color #ddaa00} ${cpu cpu2}% ${color #ff0000}${exec sensors | grep "Core 0" | cut -c15-17}$color °C ${color}${cpubar cpu2}
Temperatura tarjeta gráfica: ${color #FF0000} ${exec nvidia-settings -q gpucoretemp | grep '):' | awk '{print $4}' | cut -c -2}$color °C
${cpugraph cpu0 20,270 000000 6495ED}
${font Liberation Sans:size=9}${color #000000}PROCESO${alignc}CPU${alignr}PID${color}
${color #ddaa00}${top name 1}${alignc}${top cpu 1}%${alignr}${top pid 1}
${color #F0F8FF}${top name 2}${alignc}${top cpu 2}%${alignr}${top pid 2}
${color #F0F8FF}${top name 3}${alignc}${top cpu 3}%${alignr}${top pid 3}
${color #F0F8FF}${top name 4}${alignc}${top cpu 4}%${alignr}${top pid 4}
${color #F0F8FF}${top name 5}${alignc}${top cpu 5}%${alignr}${top pid 5}
${color #F0F8FF}...${alignr}... 	   ...  $font
${color}$processes procesos $alignr $running_processes/$processes
${color #000000}MEMORIA ${hr 2}$(color)
${color}RAM al $memperc% ${color 000066}${membar 5,00}
${color #000000}DISCO DURO ${hr 2}${color}
${color #ddaa00}Temperatura:${alignr}${color lightgrey}${exec nc localhost 7634 | cut -f 4 -d "|"}º C
${color #ddaa00}Lectura: ${alignr}${color lightgrey}$diskio_read
${color #ddaa00}Escritura: ${alignr}${color lightgrey}$diskio_write
${diskiograph 20,270 000000 941545}
${color #ddaa00}Ubuntu: ${color lightgrey}${fs_used /} / ${fs_size /} ${color 000066}${fs_bar 6 /}$color
${color #ddaa00}Datos: ${color lightgrey}${fs_used /home} / ${fs_size /home} ${color 000066}${fs_bar 6 /home}$color
${color #ddaa00}XP: ${color lightgrey}${fs_used /media/windowsXP} / ${fs_size /media/windowsXP}  ${color 000066}${fs_bar 6 /media/windowsXP}$color
${color #000000}ALIMENTACIÓN ${hr 2}${color}
${color #ddaa00}Enchufe:${alignr} ${color}${acpiacadapter}${color}
${color #ddaa00}Batería:${alignr}${color}${battery BAT1}
${color #000000}INTERNET por WIFI ${hr 2}${color}
${color #ddaa00}IP Publica: ${color #EAE52F}${alignr}${execi 7200 lynx -dump http://www.whatismyip.com/automation/n09230945.asp | grep . |awk '{print $1}'}
${color #ddaa00}IP Local: ${color }$alignr${execi 7200 ifconfig | grep 'inet dirección:'| grep -v '127.0.0.1' | grep -v '172.16.235.1' | grep -v '192.168.148.1' | cut -d: -f2 | awk '{ print $1}'}
${color #ddaa00}SSID: ${color }$alignr${wireless_essid wlan0}
${color #ddaa00}Quality: $alignr${color }${wireless_link_qual_perc wlan0}%  (${wireless_bitrate wlan0})
${wireless_link_bar wlan0}
${color lightgrey}Download:${color} ${downspeed wlan0} KB/s$alignr${color lightgrey} Upload:${color} ${upspeed wlan0} KB/s
${color}${downspeedgraph wlan0 20,200 ddaa00 ddaa00} ${color}${alignr}${upspeedgraph wlan0 20,70 ddaa00 ddaa00}
${color lightgrey}Descargado: ${color}${totaldown wlan0}$alignr${color lightgrey}Subido: ${color}${totalup wlan0}
${color slate grey}Conexiones ${color lightgrey}Entrada: ${color #ff0000}${tcp_portmon 1 32767 count}${alignc}${color lightgrey}Salida: ${color #ff0000}${tcp_portmon 32768 61000 count}${alignr}${color #ddaa00}Total: ${color #ff0000}${tcp_portmon 1 65535 count}
${color #000000}INTERNET por CABLE${hr 2}
${color lightgrey}Download:${color} ${downspeed eth0} KB/s$alignr${color lightgrey} Upload:${color} ${upspeed eth0} KB/s
${color lightgrey}Descargado: ${color}${totaldown eth0}$alignr${color lightgrey}Subido: ${color}${totalup eth0}
${color #000000}MENSAJES DE KERNEL ${hr 2}${color}
${exec dmesg | tail -n 4}

Enlaces útiles:
Web de Conky
Foro ubuntu con .conkyrc de la comunidad
Variables predefinidas por conky
Comandos de confugiración

Intrusiones en redes de area local por Man in the Middle

mono dsniffDsniff nos demuestra lo inseguras que son nuestras redes, sobretodo si nos empeñamos en enviar contraseñas en formato texto plano. Con este sniffer, nos daremos cuenta de los realmente importante que puede llegar a ser la utilizacion de la encriptacion en nuestras comunicaciones diarias …

Dsniff es una suite para redes de area local como el aircrack lo es en las redes wifi. Es muy potente y el autor advierte que no abusemos de este software. Esta suite incluye muchos programas, que ire explicando uno a uno:

Sigue leyendo