Category Archives: Tips - Page 2

NFS: Configuración de los clientes

Si compartimos en nuestra red directorios a través de NFS tenemos que configurarlos correctamente por si se produce una caida del servidor las máquinas clientes no se queden colgadas.

Estas opciones tenemos que añadirlas al archivo de configuración de puntos de montajes estático, en /etc/fstab en la siguiente línea:

# <file system>       <mount point>   <type>  <options>     <dump>  <pass>
SERVER:/path/to/share /mnt/nfs        nfs     rw,hard,intr  0       0

Las opciones son:

  1. rw: Será de lectura y escritura.
  2. hard: El programa que intenta acceder al fichero en el directorio abortará cuando el servidor no esté disponible. En contraposición a esta opción está soft que lanzará una excepción o señal al proceso que intenta acceder al fichero, pero no todos los programas manejan estas excepciones/señales de forma elegante y puede ocasionar bloqueos. La opción recomendada es la que se indica.
  3. intr: Establecemos que el proceso que está accediendo al directorio puede ser accedido mediante interrupción. Si el servidor no está disponible podremos lanzar la interrupción de teclado Ctrl + C para abortar el intento.

Con estás dos sencillas opciones podemos estar seguro que el cliente será tolerante con los fallos que se produzcan en la red o en el servidor.

Para más información aquí.

No se carga .bashrc al iniciar sesión por SSH

Si iniciamos sesión en alguna máquina remota por ssh y vemos que no nos carga el fichero ~/.bashrc donde es más que probable que tengamos definida nuestra configuración favorita para la shell con un PS1 personalizado, un PATH más cómodo o algunos Alias útiles, es porque al iniciar sesión por ssh se lee el fichero ~/.bash_profile así, lo que debemos hacer es indicar en este fichero que utilice la configuración almacenada en ~/.bashrc.

 $ vim .bash_profile

Añadimos

if [ -f ~/.bashrc ]; then
  .  ~/.bashrc;
fi

Como vimos en alguna entrada anterior usar un . (PUNTO) es un alias del comando source que permite cargar la configuración almacenada en un archivo.

Controlando Acceso al Comando SU

Hoy vamos a explicar un método para controlar el acceso de los usuarios al comando su que permite hacerse pasar por otro usuario del sistema o por root si no se le pasan parámetros.

Si escribimos

su -

También cargaremos el entorno (variables del sistema) de ese usuario.

Lo primero que tenemos que hacer es ver cuales son los permisos del binario, en Debian son estos.

$ ls -l /bin/su
-rwsr-xr-x 1 root root 34024 sep 26 15:59 /bin/su

Vemos que tiene activado SetUID, lo que significa que el usuario que ejecuta lo hace con los permisos del propietario del binario.

Para controlar que usuarios van a poder ejecutar este comando vamos a crear un grupo, por ejemplo su

# groupadd su

Cambiamos el grupo de su

# chgrp su /bin/su

Y ajustamos los permisos para que no sea leído/ejecutado por el mundo

# chmod 4750 /bin/su

Nos queda así

$ ls -l /bin/su
-rwsr-x--- 1 root su 27108 nov 14  2009 /bin/su

Ahora tomamos los usuarios que queramos que puedan hacer su al sistema y los agregamos al grupo

# usermod -G [grupos],su

La sintaxis del comando usermod para cambios de grupo obliga a poner todos los grupos a los que el usuario pertenece, si no lo haces, solo quedará en el grupo su.

Históricamente, esto se hacía a traves del grupo wheel pero cayó en desuso.

Backup de Clientes Windows en Servidores Linux

Estaba yo dándole vueltas a como arreglar la historia de hacer copias de seguridad de las máquinas de los usuarios. Hasta ahora había probado Unison y una versión de RSync para Windows, pero no estaba satisfecho. El problema se producía al intentar copiar ficheros que estaban fuera del directorio de usuario, en windows es %USER% o algo así, de vez en cuando, había que hacer una modificación a esos archivos para darles “Control total”. Hay que sumar, que mis usuarios son los de contraseñas basadas en gruesos algoritmos de cifrado, efectivamente, 1234 es la más común, así que no pueden iniciar sesión en el servidor, sólo transferencia por sftp con chroot a su $HOME.

Read more »

Notificando Nuevas Series Compartidas

Como todo buen friki que se precie, sigo un montón de series, tantas que mis usuarios se pierden cada día buscando las novedades en la carpeta compartida por NFS que tengo en mi red. El directorio compartido es /mnt/almacen/Media, un Seagate Barracuda de 1TB, de ahí cuelgan las series cada una en su directorio, muy bien ordenado.

Pues bien, apoyandome en el demonio Incron, he creado un sistema para notificar por correo electrónico a mi lusers cada novedad. El problema es que incron no implementa todavía la recursividad sobre subdirectorios, así que hay que supervisar cada uno por separado.

Este es el contenido:

bigBangTheory            Dollhouse           House          Mental               Numbers         RobinsonCrusoe    TheBeast
Bones                    EntreFantasmas      Hung           MentesCriminales     Olvidados       RomaCriminal      TheITCrowd
cocheFantastico          Eureka              incoming       Mercy                PadreDeFamilia  SamanthaWho       TheListener
ComoConociAVuestraMadre  EverybodyHateChris  kyle           Mienteme             pelisVistas     scrubs            TorchWood
csi                      FlashForward        LaPeceraDeEva  Monk                 Psych           siesta            Trauma
Deadwood                 Greek               Life           MP3s                 Reaper          Simpson           TrueBlood
Dexter                   Heroes              LifeOnMars     MujeresDesesperadas  Ritchies        StargateAtlantis  videosChicos
Docus                    Historicas          meLlamoEarl    MyOwnWorstEnemy      RobinHood       supernatural      Weeds

Escribir una línea de incrontab para cada uno es algo que no estaba dispuesto a hacer, así que se recurre a find y awk.

find /mnt/almacen/Media/ -maxdepth 1 | awk '{ print $1 " IN_MOVED_TO /home/nordri/bin/incron/nuevoMedio.py $@ $# " }'

Este comando, que debemos redireccionar a un fichero, nos mostrará esto:

[...]
/mnt/almacen/Media/Mienteme IN_MOVED_TO /home/nordri/bin/incron/nuevoMedio.py $@ $#
[...]

Que creara un monitor para el directorio, en caso que algún fichero sea movido dentro del directorio, ejecutará el comando nuevoMedio.py con los parametros $@ y $# que son la ruta completa y el nombre del archivo.

Existen, también dos detalles, uno es el directorio históricas donde guardo las series finalizadas, canceladas y discontinuadas. Esto es porque me gusta saber que series he seguido. El otro detalle, es supervisar la raíz de Media para avisar en caso que se añada una nueva serie. Las líneas que hay que añadir al incrontab son las siguientes.

/mnt/almacen/Media/Historicas IN_MOVED_TO /home/nordri/bin/incron/nuevoHistorico.py $#
/mnt/almacen/Media IN_CREATE /home/nordri/bin/incron/nuevoDirMedio.py $#

Bien, pasemos a la programación, todos los scripts son en el básico Python que manejo, pero que resulta útil para estas cuestiones. El script nuevoMedio.py

import avisoPorEmail
import sys
def getCategoria(t):
  c = t.split("/")
  l = len(c)
  return c[l-1]
categoria  = getCategoria(sys.argv[1])
email = open("/tmp/email", "w")
email.write("En la categoria : " + categoria + "\n\nSe ha compartido un nuevo archivo multimedia: \n\n" + sys.argv[2] + "\n\n enjoy ;) ")
email.close()
asunto = "Nuevo archivo multimedia"
direcciones = [ #direcciones# ]
avisoPorEmail.mail('/tmp/email', asunto, direcciones, 'txt')

Simplemente, recibe la ruta del directorio compartido, elimina las barras y nos quedamos el nombre de la serie, que será la categoría, el segundo parámetro es el nombre del archivo, que lleva consigo el episodio, y todo lo que los uploaders le añaden para autopromocionarse. Se escribe la cadena en un archivo y se manda por correo a las direcciones que se le indican en el array. Hay que avisar a los usuarios que miren en spam por si acaso. A mi me pasa.

Los scripts de nuevoDirMedio.py y nuevoHistorico.py son muy similares.

import avisoPorEmail
import sys
import os
categoria  = sys.argv[1]
email = open("/tmp/email", "w")
email.write("Se está siguiendo una nueva serie : " + categoria + "\n\n enjoy ;) ")
email.close()
asunto = "Nueva Serie"
direcciones = [ #direcciones# ]
# Dar de alta el nuevo directorio en incron
os.system('/home/nordri/bin/incron/nuevoDirVigilado.sh ' + categoria)
avisoPorEmail.mail('/tmp/email', asunto, direcciones, 'txt')

Prácticamente igual, la peculiaridad aquí está en que si creamos un nuevo directorio, debemos dar de alta el monitor para incron. Para ello utilizo el siguiente script.

echo "/mnt/almacen/Media/$1 IN_MOVED_TO /home/nordri/bin/incron/nuevoMedio.py \$@ \$#" > /tmp/tareaIncron.txt
incrontab -l >> /tmp/tareaIncron.txt
incrontab /tmp/tareaIncron.txt

Simple, no? Se escribe la tarea en un archivo auxiliar, se anexa el contenido del incrontab actual y se recarga usando el archivo auxiliar como base.

El último es para cuando una serie se pasa al histórico, así,

import avisoPorEmail
import sys
def getCategoria(t):
  c = t.split("/")
  l = len(c)
  return c[l-1]
categoria  = getCategoria(sys.argv[1])
email = open("/tmp/email", "w")
email.write("La serie : " + categoria + "\n\nHa sido cancelada o discontinuada. Perdone las molestias")
email.close()
asunto = "Serie abandonada"
direcciones = [ #Direcciones# ]
avisoPorEmail.mail('/tmp/email', asunto, direcciones, 'txt')

Pues bien, cada vez que algo se mueva del incoming del Torrent a su directorio se avisará a los usuarios con un correo electrónico.