domingo, 8 de diciembre de 2013

Función para sh "Bytes to Human Readable" (bytestohr)

El otro día estaba escribiendo un script en el que quería mostrar en pantalla, entre otras cosas, la cantidad de información traspasada por rsync entre dos máquinas. La cantidad la tenía en bytes y me interesaba mostrarla en KB, MB o GB.

Dicen que reinventar la rueda es una pérdida de tiempo, así que me puse a buscar alguna función en sh que lo hiciese. Y me tropecé con esta: bytestohr escrita en ksh.

Tras unos pequeños ajustes para que funcionase en sh, aquí va:

bytestohr()
{
    # Convert input parameter (number of bytes)
    # to Human Readable form
    #
    SLIST="bytes,KB,MB,GB,TB,PB,EB,ZB,YB"

    POWER=1
    VAL=$( echo "scale=2; $1 / 1" | bc)
    VINT=$( echo $VAL / 1024 | bc )
    while [ $VINT -gt 0 ]
    do
        POWER=$(expr $POWER + 1)
        VAL=$( echo "scale=2; $VAL / 1024" | bc)
        VINT=$( echo $VAL / 1024 | bc )
    done

    echo $VAL $( echo $SLIST | cut -f $POWER -d, )
}

Como cualquier otra función en sh, la forma de llamarla es la siguiente:

$ bytestohr 65456456
62.42 MB

Simple pero efectiva.

sábado, 23 de noviembre de 2013

Creación masiva de usuarios

Cuando se instala un servidor de ficheros, de FTP o similar, uno de los pasos posteriores consiste en crear un número razonablemente alto de usuarios en nuestro sistema Linux. Veamos una forma asequible de conseguir esto.

Crearemos un fichero de texto, usuarios.txt en nuestro caso, en el que cada linea corresponderá a un usuario:

login01:password01:1001:1001:Nombre del usuario 01:/var/ftp/:/bin/false
login02:password02:1002:1002:Nombre del usuario 02:/var/ftp/:/bin/false
login03:password03:1003:1003:Nombre del usuario 03:/var/ftp/:/bin/false
[...]

Los campos, separados por ":", significan lo siguiente:

  • login-01: el login del usuario que se quiere crear
  • password01: el password de dicho usuario, en texto claro
  • 1001: ID que va a tener el usuario. Tendremos que llevar cuidado para no elegir uno en uso (ver fichero /etc/passwd para comprobar los que están en uso)
  • 1001: ID del grupo al que va a pertenecer el usuario. Tendremos que llevar cuidado para no elegir uno en uso (ver fichero /etc/group para comprobar los que están en uso)
  • Nombre del usuario 01: Nombre completo del usuario
  • /var/ftp/: Directorio home del usuario. Este ejemplo podría ser adecuado para crear usuarios destinados a usar un servicio FTP.
  • /bin/false: Shell que usará el usuario al logarse en el sistema. En caso de usuarios que solo deban conectarse por FTP o por SAMBA podría ser adecuado, pues no permite acceder a un shell. En caso de necesitar shell, se podría poner /bin/bash o cualquier otro.

Y por último, hacemos la magia:

# newusers usuarios.txt

Todos los usuarios serán creados con los datos especificados. Y además, podemos guardarnos este fichero a modo de backup, por si el servidor se fastidia y hay que montar uno similar.

Comentar que esta forma de crear usuarios masivamente viene muy bien para ser usada con algún script que genere usuarios y contraseñas (aleatorias u obtenidas de una base de datos).

Como pega, si los usuarios se están creando para que accedan por SAMBA al servidor, habrá que hacer por cada uno de ellos un smbpasswd -a login01 para crearles la contraseña y permitirles el acceso vía SAMBA.

martes, 18 de octubre de 2011

Espacio de uso de directorios

Más de una vez un equipo o servidor se ha quedado con poco espacio libre en una partición, o incluso se ha agotado. Ahí comienza una labor de búsqueda de aquellos ficheros que han crecido inesperadamente o bien de los directorios con mayor peso para revisarlos y ver si se puede borrar algo.
Si bien seguro existen aplicaciones que revisan el sistema de ficheros en busca de este tipo de información, no me gusta instalar software extra en servidores si con las herramientas ya existentes se puede obtener el mismo resultado.
El siguiente comando nos dirá la ocupación de cada uno de los subdirectorios que tenemos en nuestra ruta actual:

for i in $(find . -maxdepth 1 -type d | tr -s "\n" " "); do  echo `du $i -hs`; done

873M . 60K ./include 214M ./lib 4,8M ./sbin 35M ./bin 393M ./share 4,0K ./games 136M ./local 92M ./src

El resultado del comando ejecutado en /usr nos dice que este directorio ocupa, contando con sus subdirectorios y ficheros), 873 MB. Que el subdirectorio local (/usr/local) ocupa 136 MB, etc. Si vemos un subdirectorio con un uso de disco exagerado podremos acceder a él y volver a ejecutar el comando, para ir descubriendo dónde están esos ficheros de gran tamaño.