IES Miguel Romero Esteo - Departamento de Informática - Linux/Unix

Bash y Programación bash / Práctica 15



NOMBRE

crtuserdb - Crea un fichero con idéntico formato a /etc/passwd.

SINOPSIS

crtuserdb DIRECTORIO

DESCRIPCION

Utilizando la información contenida en los ficheros preformateados descritos en el apartado FICHEROS crea en DIRECTORIO un fichero de nombre crtuserdb.candidato con formato idéntico a /etc/passwd. Este script podría ser usado para añadir usuarios a /etc/passwd de forma masiva previa generación en un fichero candidato y pasando por un proceso de filtro. Los ficheros crtuserdb.name, crtuserdb.groups, crtuserdb.shells (descritos en el apartado FICHEROS) deben existir antes de ejecutar el script, no los crea el script, debe ser un procedimiento manual ejecutado por el alumno o resultado de un script independiente.

FUNCIONAMIENTO

Por cada registro contenido en el fichero crtuserdb.name se debe crear un registro en el fichero crtuserdb.candidato, entendiendo que cada registro del fichero crtuserdb.candidato es un futuro inquilino del fichero /etc/passwd. Este script NO INSERTA información en /etc/passwd, lo deja todo preparado para que el administrador lo haga cuando considere oportuno.
DIRECTORIO debe ser un directorio existente en el sistema, de lo contrario, el proceso se detiene informando de tal circunstancia.
Cada vez que se ejecuta este script el contenido del fichero crtuserdb.candidato se sobrescribe.
Cada uno de los campos de los registros del fichero crtuserdb.candidato contendrán valores de acuerdo a las siguientes especificaciones:
campo1: nombre del usuario extraído del fichero crtuserdb.name.

campo2: Carácter "x".

campo3: Identificador de usuario (uid). Se genera en secuencia creciente a partir del primero que no exista en /etc/passwd y que esté dentro del rango correcto El rango viene determinado por las variables UID_MIN y UID_MAX registradas en /etc/login.defs, ningún uid de los que maneje este script puede estar fuera de ese rango; los valores del rango UID_MIN..UID_MAX son distintos en cada sistema GNU/Linux y queremos que este script se pueda usar en cualquier distro GNU/Linux, en otras palabras, los valores del rango no se pueden establecer como constantes dentro del código del script, hay que averiguarlos cada vez que se ejecute el script. Otra cuestión a tener en cuenta es el incremento para calcular el "siguiente uid"; no se puede pensar en un incremento constante a partir del primer uid libre localizado ya que no existe seguridad de que los uid existentes en /etc/passwd respeten una secuencia constante (en la vida de un sistema los usuarios se insertan y se eliminan a discreción por lo que podrían estar ocupados el 1000, 1002, 1004, 1006, 1007, 1009 por tanto este script tendría que asignar el 1003, el 1005 y el 1008).

campo4: Identificador de grupo principal. Este valor se establece extrayendo el nombre del grupo de pertenencia del fichero crtuserdb.group. Si el nombre del grupo existe en el sistema se utiliza el gid asociado a él; si el nombre del grupo no existe se asigna el gid del grupo de nombre staff (siempre presente en GNU/Linux).

campo5: Sin contenido pero presente.

campo6: Cadena de caracteres compuesta por el literal fijo "/home/" seguido del nombre del usuario.

campo7: Para usuarios con uid impar se asignará el valor del campo2 del registro almacenado en el fichero crtuserdb.shells y cuyo campo1 es igual a 1. Para usuarios con uid par se asignará el valor del campo2 del registro almacenado en el fichero crtuserdb.shells y cuyo campo1 es igual a 2.

FICHEROS

$DIRECTORIO/crtuserdb.name
cat << EOF > $DIRECTORIO/crtuserdb.name
contable
gerente
director
operador
ventas
compras
almacen
EOF

---------------------------------------------------------------------------------------

$DIRECTORIO/crtuserdb.group
cat << EOF > $DIRECTORIO/crtuserdb.group
contable:contable
gerente:gerente
director:director
operador:operador
ventas:ventas
compras:compras
almacen:almacen
EOF

---------------------------------------------------------------------------------------

$DIRECTORIO/crtuserdb.shells
cat << EOF > $DIRECTORIO/crtuserdb.shells
1:/bin/bash
2:/bin/sh
EOF