Script creacion usuarios Linux

Shalauras

Buenas a todos,

Bueno, abro este hilo para a ver si alguien que sepa un poco de shell scripts me puede echar una mano. Mi idea es crear un script que cree usuarios de Linux, todo esto automaticamente, y que ademas le ponga una password, se que esto deberia hacerse con un perl, por que el shell script no encripta la password y la password debe ser encriptada por eso el uso de un perl(aunque seria una alegría saber que no es necesario el perl y se puede realizar sin el perl, todo en un mismo shell script).
Andando por google he visto algunos ejemplos pero todos los ejemplos que veo son poniendo tu por teclado los valores que quieres, yo lo que quiero es que todo se haga solo, es decir, me pregunte, ¿cuantos usuarios quieres crear? y automaticamente me cree todos los usuarios (usuario1, usuario2..) con password (usuario1, usuario2...)

Aqui dejo el que vi por internet junto con el perl que vi por internet a ver si alguien sabría automatizarlo, yo de programacion de shell ando algo perdido y me cuesta mucho hacer grandes avances.

Script Shell

#!/bin/bash

crearusuarios v 0.1

Script interactivo para crear usuarios en un sistema Unix

#Copyright (C) 2006 Woodstock preguntamealgo@gmail.com

#This program is free software; you can redistribute it and/or
#modify it under the terms of the GNU General Public License
#as published by the Free Software Foundation; either version 2
#of the License, or (at your option) any later version.

#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
#GNU General Public License for more details.

#You should have received a copy of the GNU General Public License
#along with this program; if not, write to the Free Software
#Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

Limpio la pantalla

clear

Imprimo el cartel en pantalla

tput cup 1 18 ; echo -n "************************"
tput cup 2 18 ; echo -n "SCRIPT PARA CREAR USUARIOS"
tput cup 3 18 ; echo -n "
************************"

Me fijo si mi id es 0 (correspondiente a root) de lo contrario salgo

ya que necesito permisos de root para crear usuarios nuevos

if [ "id -u" != 0 ] ; then
echo -e "\n"
echo "Necesito tener permisos de root para ejecutar mis tareas,"
exit 1
fi

echo -e "\n"
echo -e "\n"
echo "Ingrese el nombre del nuevo usuario: "
read nombre

Si el nombre del usuario está vacío entonces salgo del script

if [ "$nombre" == "" ] ; then
clear
echo -e "\n"
echo "El nombre no puede estar vacío"
echo -e "\n"
exit 1
fi

echo -e "\n"
echo "Ingrese el home directoy (default /home/$nombre): "
read home

Si no ingreso ningún directorio home dejo el que viene por defecto

if [ "$home" == "" ] ; then
home="/home/$nombre"
fi

Ingreso el grupo 1000 que generalmente es el de usuarios comunes por defecto

echo "Ingrese el grupo (default 1000): "
read grupo

if [ "$grupo" == "" ] ; then
grupo=1000
fi

echo "Ingrese el shell a utilizar (default /bin/bash): "
read shell

Si no ingreso ningún shell como por ejemplo un menu, dejo con el shell por defecto

if [ "$shell" == "" ] ; then
shell="/bin/bash"
fi

Limpio la pantalla

clear

Hago un resumen de los datos ingresados

echo "Los datos ingresados son los siguientes:"
echo "****************************************"
echo -e "\n"
echo "Nombre del usuario: $nombre"
echo "Shell por defecto : $shell"
echo "Directorio home: $home"
echo "Grupo del usuario: $grupo"
echo "-------------------------------------------"
echo "Si los datos son correctos pulse una tecla,"
echo "de lo contrario pulse Ctrl+C para cancelar"
read

Creo el usuario con las variables

useradd -d /home/$nombre -g $grupo -m -s $shell $nombre

Si hay un error salgo del script

if [ "$?" != 0 ] ; then
echo -e "\n"
echo "Ha ocurrido un error, asegurese de que los datos ingresados son correctos."
exit 1
fi

Por último pido la contraseña

echo -e "\n"
echo "Ingrese una contraseña para $nombre"
passwd $nombre

Si la contraseña no dio ningún error y llegamos a este paso el usuario ya esta creado :)

echo -e "\n"
echo "El usuario fue creado satisfactoriamente"

Archivo Perl con el que la encripta

#!/usr/local/bin/perl
#

call it like so: perl crypt.pl password

srand (time());
my $randletter = "(int (rand (26)) + (int (rand (1) + .5) % 2 ? 65 : 97))";
my $salt = sprintf ("%c%c", eval $randletter, eval $randletter);
my $plaintext = shift;
my $crypttext = crypt ($plaintext, $salt);

print "${crypttext}";

Como ya he dicho, eso lo hace pero pidiendo por pantalla los valores, yo quiero que todo eso sea automatico.

Gracias y un saludo.

Gnos1s

En principio, lo único que necesitas es pedir al principio el número de usuarios a crear, definir el nombre de los usuarios por defecto (por ejemplo, "chikilicuatre", al que luego tendrás que añadirle el número N concatenándoselo, para que quede "chikilicuatreN"). Además, N también te sirve para el bucle que crea todos los usuarios.

No estoy seguro, ahora mismo estoy en Windows, pero para concatenar creo que haciendo "cat usuario$N > $usuario_con_numero" conseguirás concatenar chikilicuatre1, si $N=1, y así con todos.

Por si te sirve de utilidad, échale un vistazo a este manual de shell.

Cuando arregle una cosa de linux, le echo un vistazo si nadie te ha resuelto la tarea, y de paso desempolvaré esa parte que no toco desde diciembre.

Shalauras

Si, crear usuarios con N es así, usuario$i (donde i es el principio del bucle for donde quiero crear 5 usuarios por ejemplo) el problema viene cuando quiero poner una password, el shell no encripta las password y al poner "passwd usuario$i" no t falla pero dspues si intentas logear da fallo, x eso hay que usar el perl que encripta la clave.
Mi intencion es hacerlo automatico , todo en un archivo (o dos si es necesario, pero automatico)

Gnos1s

Lo normal es que en el fichero /etc/passwd se actualice el segundo campo de la entrada con la información del usuario...

nombre:X:.(resto de campos)

La X significa que tiene contraseña y está encriptada, en el fichero /etc/shadow.

Y en el fichero /etc/shadow, aparece...

nombre:pass_encriptada:.(resto de campos)

Si haces "passwd usuario", al escribir la contraseña 2 veces, debería actualizarse ese fichero.

Prueba crear tu uno a pelo en un shell, y observar esos archivos, al final de cada uno.

Yo haría de prueba esto:


sudo useradd -d /home/probando probando
su probando
passwd (y meto la contraseña "chikichiki", por ejemplo)
exit
sudo gedit /etc/passwd

En la última línea aparecerá algo así como...

probando:X:.(más campos, uid, gid, gecos):/home/probando:/bin/bash

Cierras, y luego pruebas "sudo gedit /etc/shadow" y miras si el segundo campo de probando es una cadena rara (encriptado).

Si eso te va, entonces lo otro debería. Lo que no entiendo es para qué hace falta el fichero que encripte, si el propio proceso de crearlo lo hace.

Luego elimina el usuario "userdel probando".

Haz eso y me cuentas.

También probaría crear el usuario, y en el propio script, que hiciera "su usuario", y como el usuario nuevo creáramos la contraseña, y ver los anteriores ficheros si reflejan los cambios.

Shalauras

Eso lo probe hace un par de dias y no tuvo exito, te cuento.
Si en el script pones useradd chikichiki -d /home/chiki
y abajo, passwd chikichiki, tu introduces una clave pero no la encripta, es decir le mets valores por pantalla, la diferencia radica en que al hacerlo tu a mano (sin script)
useradd pepito -d /home/pepito
passwd pepito
->la introduces 1 vez
->la introduces la 2ª vez

al hacer esto, linux encripta la clave y por eso aparece en /etc/passwd y /etc/shadow como pepito:X:....

El script por si solo no es capaz de al poner passwd loquesea, encriptar la clave, por eso usando el perl ese, si se logra, pero claro, yo quiero que sea automatico, que cn ejecutar el script cree 10 usuario con los siguientes valores por ejemplo:

user: administrativo_pc01
pass: administrativo_pc01

user: administrativo_pc02
pass: administrativo_pc02
..
...
....

Quizas haya que probar alguna chapuza estilo algo que no consigo resolver jeje

Gnos1s

Cuando quieres encriptarla, ¿cómo usas el fichero perl? No sé qué guión estás usando actualmente. Si pudieras pegarlo aquí, vendría bien.

Otra cosa que no entiendo. Cuando encriptas la clave, ¿pretendes grabarla en el /etc/shadow? Decías que daba fallo al hacer login porque no la encriptaba, pero si la encriptas con perl... ¿cómo la entiende luego al intentar desencriptarla?

A mí se me ocurre llamarlo, como te dice en el perl, en tu caso...


$password=perl crypt.pl $usuario

-> Modifico /etc/passwd (usuario:X:...)
-> Modifico /etc/shadow (usuario:pass_encriptada_perl:...)

Aún no he probado en Linux, luego a la noche si me acuerdo lo pruebo y te digo. Es bastante interesante.

thelegend
Gnos1s

He estado hablando con una profesora mía y me ha dicho que seguramente con grub-md5-crypt sirva.

Luego hago las pruebas y ya te digo.

Shalauras

Uhmmmmm te cuento aunque antes de nada, gracias por tus respuestas, ya que yo tambien me guio en ello para seguir buscando.

El Perl como ya dije lo busque por internet, realmente no se que hace pero la cosa es que cuansdo t pide por pantalla la pass, la pones y se encripta correctamente y te permite logear con el usuario nuevo creado, como ya te digo, no se por que exactamente, ni en q variable la encripta. Mi idea es juntar esos scripts que ya funcionan haciendolo manual(pones tu x pantalla los datos), juntandolos con bucles for y hacerlo automatico, es decir, ejecuto el script y hace 20 usuarios.

Si puedes prueba lo que me dices de md5, yo probaré tambien, aunque hasta el momento mi idea d juntarlo con bucles for no tuvo exito, probaré eso que me dices.

Un saludo

Y

simplemente crea un fichero que haga una especie de echo "linea" > /etc/passwd que vuelque la información al passwd,algroup y al shadow
y para la contraseña en shadow puedes usar mkpasswd, en el que usando /dev/random puedes crearte la contraseña que quieras. Yo te aconsejo que la contraseña siempre sea la misma principal, por ejemplo inicio, pero a la hora de pasarlo por el mkpasswd no usar el mismo seed, para que le md5 resultante sea distinto.

Saludos

Gnos1s

Al final he conseguido hacer lo que querías. Me queda comprobar una cosa y pego el script y los comentarios oportunos :).

Yohnah, es otra buena opción, pero creo que así es más parecido a lo que él ya tenía, y comandos típicos de gestión de usuarios.

Gnos1s

Bueno Shalauras, aquí está finalmente lo que querías ^.

Al final he usado el archivo perl para encriptar, y era muy sencillo de usar.

El código es el siguiente:


#!/bin/bash

Se necesita ser root para que funcione este script



printf "Introduzca el número de usuarios a crear\n"
read numUsers

for i in seq 1 1 $numUsers # Desde 1, de 1 en 1, hasta $numUsers
do
user="usuario$i" # Cadena de usuario por defecto
printf ">>$user\n" # El usuario a crear (optativo)
encriptada=perl encripta.pl $user # Encripta la contraseña

  # Creamos el usuario, le asignamos directorio de trabajo y como contraseña la encriptada
  useradd -m -s /bin/bash -p $encriptada $user

done
[/i]

Comentarios: Para ejecutar el script se necesita ser root para poder crear los usuarios, y demás.

La estructura general es un bucle for, controlado por $i, que toma los valores del 1 al número de usuarios que se quieran crear, $numUsers.

La instrucción "seq 1 1 $numUsers" hace que la variable $i vaya desde el primero de los tres valores (1), hasta el último ($numUsers), dando saltos del valor del centro (1).

Defino la cadena por defecto en la variable $user (que puedes cambiarla por otro si quieres) cocatenándola al contador (que nos dice el número de usuario actual). Lo de imprimir el usuario es optativo, era por ver en la pantalla como quedaba.

Para usar el fichero perl (yo le he llamado encripta.pl), hago que la variable $encriptada se le asigne el valor de ejecutar ese comando (que se pone entre ``, acentos agudos, los de la tecla `[), y ya tenemos la clave encriptada.

La instrucción useradd -m -s /bin/bash -p $encriptada $user crea un usuario, con las siguientes opciones:

-m -> Crea el directorio de trabajo del usuario
-s -> Le asigna el shell BASH al usuario
-p -> Le dice que tiene que usar esa clave para $user

Los ficheros /etc/passwd, /etc/shadow y /etc/group quedan de la siguiente manera (para 5 usuarios creados):

/etc/passwd


...
usuario1:x:1001:1001::/home/usuario1:/bin/bash
usuario2:x:1002:1002::/home/usuario2:/bin/bash
usuario3:x:1003:1003::/home/usuario3:/bin/bash
usuario4:x:1004:1004::/home/usuario4:/bin/bash
usuario5:x:1005:1005::/home/usuario5:/bin/bash

/etc/shadow


...
usuario1:EwESS/s8neuGw:14007:0:99999:7:::
usuario2:EwPHpV1GohsNY:14007:0:99999:7:::
usuario3:Ew4NQf46edQOk:14007:0:99999:7:::
usuario4:BQN4nOBqUHs.Q:14007:0:99999:7:::
usuario5:BQVMyj4DCdAwQ:14007:0:99999:7:::

/etc/group


...
usuario1:x:1001:
usuario2:x:1002:
usuario3:x:1003:
usuario4:x:1004:
usuario5:x:1005:

Todo esto correcto, pero necesitarás hacer una cosa.

El directorio /etc/skel es un directorio que tiene unos archivos que son los que se copiarán al crear a un usuario con la opción -m. Es decir, lo que pongas ahí, se va a copiar en el directorio HOME a todos los usuarios que crees en el sistema como root.

Generalmente los ficheros que están son (aparecen ocultos, ls -la para verlos en el shell, o Ctrl+H en Nautilus para mostralos):

  • .bash_profile (para los logins)
  • .bashrc (cada vez que se abre un shell)
  • .bash_logout (el usuario se cambia)

En concreto, yo uso Ubuntu Hardy Heron y esos ficheros no estaban, sólo una carpeta llamada Example (la misma que aparece en el HOME tuyo si te fijas, es por eso ;)).

En Fedora ya están ahí, al menos en el core 8 que es con el que trabajamos en la universidad en los laboratorios.

Para solucionar esto, lo que hecho es loguearme como root y copiar esos ficheros del directorio /home/mi_usuario al directorio /etc/skel, así cuando he probado crear los usuarios, todos tenían esos archivos dentro (que era lo que me faltaba por probar antes).

Como ahora puedes ver, el asignar como shell a los usuarios BASH no ha sido por capricho, si no para que esos ficheros tengan sentido (si eligieras otro shell, como sh, o csh, etc.., tendrías que coger los adecuados y meterlos ahí).

Esos ficheros puedes modificarlos si quieres (son guiones shell normales y corrientes), para hacer ciertas cosas, como asignar editores por defecto, restringir el usuario (usando el rbash y no bash), modificar variables, que se ejecuten unos comandos cuando el usuario se loguea, etc).

Yo aquí añadiría en el fichero .bashrc de la carpeta /etc/skel (para que se refleje en todos), que cuando se loguee el usuario, se le cambie el directorio al suyo de trabajo, aunque eso ya a tu gusto. (Con el comando env sacas las variables de entorno, puede servirte).

Por último, he dejado a tu elección el incluir detección de errores y otros mensajes de información.

Espero que te sirva de ayuda. Si tienes alguna duda, coméntalo aquí o me envías un mensaje privado :).

Shalauras

Bueno, basandome un poco en todo he elaborado el script final donde le mando la ruta a un fichero donde escribo los usuarios a crear de la siguiente manera: 1:user1:passuser1

Con esa estructura el script lee todas las lineas y lo crea encriptada (con un perl) . Pego el script por si a alguien le interesa:

Fichero donde recoge los usuarios(/root/scripts/usuarios)

1:paco1:paco1
2:user2:paco2
3:paco3:paco3
4:user4:user4
5:user5:user5

Script de Creacion

#!/bin/bash
#el total de lineas del archivo que contiene los usuarios.
#el archivo de los usuarios, contiene un listado de todos los usuarios a agregar
#con la estructura: NumeroUsuario:usuario:password
lineas=cat /root/scripts/usuarios | wc -l
let lineas=lineas+1
i=1

#bucle hasta que $i es igual al numero de lineas, es decir, hasta que se ha leid
o
#todo el fichero
while [ $i -lt $lineas ];do
#obtenemos cada una de las lineas
linea=head -$i /home/aula07_pc01/usuarios | tail -1
#obtenemos el identificador del usuario
nuevo_identificador=echo $linea | cut -d: -f1
#aumentamos en 1000 el identificador del usurio. Esto lo hacemos, ya que
los
#identificadores de nuestro archivo, empiezan por el 1.
nuevo_identificador=expr $nuevo_identificador + 1000
#cogemos el nombre del nuevo usuario
nuevo_usuario=echo $linea | cut -d: -f2
#cogemos ca contraseña del nuevo usuario
nuevo_password=echo $linea | cut -d: -f3

    #codificamos el nuevo password utilizando perl
    passwordf=`perl -e 'print crypt("'"$nuevo_password"'","SA"), "\n";'`

    #Comprobamos si ya existe el identificador que vamos a añadir, para qui

tarlo
#ante de agregarlo nuevamente
viejo_identificador=cat /etc/passwd | grep :$nuevo_identificador: | cut
-d: -f1

if [ ! -z "$viejo_identificador" ];then
userdel "$viejo_identificador"
fi

    #comprovamos si ya existe el usuario que vamos a agregar.
    existeix=`cat /etc/passwd | grep ^"$nuevo_usuario:"`
    if [ -z $existeix ];then
            #agregamos el usuario y lo asignamos al grupo 100 (users)
            useradd -u $nuevo_identificador -g 100 -p $passwordf "$nuevo_usu

ario"
fi

    let i=i+1

done

Y Bueno sin mas, gracias a todos por las ayudas. La idea de Yonah tambien es buena, la tomaré para próximos retos :P

Gnos1s

Joder, pedazo de código comparado con el mío, aunque si querías cogerlo de ficheros haberlo dicho :P.

Usuarios habituales