Advertisement
angeldp

Crea users

Jun 1st, 2011
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 6.03 KB | None | 0 0
  1. #!/bin/bash
  2. #
  3. #..Script para crear usuarios a pedal..
  4. #......Autor: Ángel T. Domínguez......
  5. #..Funcionamiento: Se pretende crear un script que
  6. #.tome como parámetros una lista de nombres de
  7. #.usuarios; y proceda a introducirlos en el fichero
  8. #./etc/passwd debidamente formateados
  9. #
  10. #La función ayuda va a ser simple:
  11. #será llamada cuando se use mal el script,
  12. #bien por falta de parámetros o por no ser root
  13. #Muestra unos mensajitos y finaliza
  14. #
  15. ayuda(){
  16.     clear
  17.     echo 'Scripts para crear usuarios, forma de uso:'
  18.     echo
  19.     echo "$0 Usuario[s]"
  20.     echo -e "\nRecuerde que debe pasar al menos un usuario como parámetro."
  21.     echo -n "Y que usted debe ser "
  22.     echo 'root'
  23.     echo
  24.     echo 'Inténtelo de nuevo'
  25.     exit
  26.     }
  27. #
  28. #La función error se mostrará cuando no se pueda crear el usuario.
  29. #se encarga de finalizar el script mostrando un mensaje descrptivo."
  30. #
  31. function error(){
  32.     clear
  33.     echo "Se ha producido un error."
  34.     echo "$1"
  35.     echo "Pulse cualquier tecla para finalizar. "
  36.     read -n1 -s NADA
  37.     exit
  38.     }
  39. #
  40. #La función nummasmas obtiene el número más alto de
  41. #un rango, y devuelve el número más uno.
  42. #
  43. nummasmas(){
  44.     VALOR=`more $1 | cut -d: -f$2 | sort -n | tail -1`
  45.     VALOR=`expr $VALOR + 1`
  46.     }
  47. #
  48. #En primer lugar compruebo que se han pasado parámetros
  49. #y, de no ser así, muestro la ayuda y finalizo.
  50. #
  51. if [ -z $1 ]
  52.     then
  53.     ayuda
  54. fi
  55. #
  56. #Compruebo que el usuario es root y, si no lo es,
  57. #muestro la ayuda y finalizo.
  58. #
  59. if [ "$USER" != "root" ]
  60.     then
  61.     error "Se debe ejecutar el script con permisos de root"
  62. fi
  63. #
  64. #La comprobación anterior puede realizarse
  65. #también por medio de los permisos en /etc/passwd,
  66. #porque dicho fichero debe existir y quién ejecute
  67. #el script tiene que tener permisos de escritura
  68. #
  69. #Este if y el anterior hacen lo mismo.
  70. #
  71. if ! [ -w /etc/passwd ]
  72.     then
  73.     error "No se puede editar el fichero /etc/passwd"
  74. fi
  75. #
  76. #En este momento sé que han pasado al menos un
  77. #parámetro; y que quién ejecuta el script es
  78. #root (y tiene permisos de escritura en passwd.
  79. #
  80. #Comenzaré un bucle que iterará tantas veces como
  81. #parámetros se hayan introducido:
  82. #
  83. for USUARIO in $*
  84.     do
  85. #
  86. #   Lo primero será comprobar que el nombre de
  87. #   usuario pasado no está en uso. Para ello
  88. #   lo busco en el primer campo de /etc/passwd
  89. #   Si ya existe lo indico y paso al siguiente
  90. #   usuario (iteración.)
  91. #
  92.     CADENA=`more etc/passwd | grep "^${USUARIO}:" | cut -d":" -f1`
  93.     if [ "${CADENA}" == "${USUARIO}" ]
  94.         then
  95.         echo "$USUARIO ya existe en el sistema, será ignorado"
  96.         sleep 3
  97.         continue
  98.     fi
  99. #
  100. #   Si el usuario no existe obtengo los datos
  101. #   necesarios para construir una línea para
  102. #   añadirla al fichero /etc/passwd.
  103. #   En primer lugar el UID, que no debe repetirse.
  104. #
  105.     nummasmas /etc/passwd 3
  106.     IDU=$VALOR
  107. #
  108. #   En $IDU ya está el UID disponible gracias a la
  109. #   función nummasmas. Ahora vamos a por el GID, para
  110. #   lo cual preguntaremos al usuario por el grupo
  111. #   al que va a pertenecer cada usuario. Como le puede
  112. #   resultar tedioso, le damos la opción a que meta
  113. #   en el mismo grupo a todos los usuarios. Eso sí,
  114. #   sólo le vamos a permitir que indique nombres de grupo
  115. #   que ya existen en el sistema.
  116. #
  117. #   Primero compruebo que no haya fijado un grupo por defecto
  118. #
  119.     if [ "${OPC}" != "s" ] && [ "${OPC}" != "S" ]
  120.         then
  121.         while [ -z $FLAG ]
  122.             do
  123.             clear
  124.             read -p "Indique el grupo al que quiere que pertenezca $USUARIO: " GRUPO
  125.             FLAG=`more /etc/group | grep ^${GRUPO}: | cut -d":" -f3`
  126.             if [ -z $FLAG ]
  127.                 then
  128.                 echo -e "\nDebe introducir un grupo existente; y $GRUPO no lo és."
  129.                 sleep 2
  130.             fi
  131.         done
  132.         IDG=$FLAG
  133.         FLAG=""
  134.         echo "$USUARIO va a formar parte del grupo $GRUPO."
  135.         echo "¿Desea fijar $GRUPO como grupo por defecto para el resto de usuarios? "
  136.         echo "Si pulsa "N" se le volverá a preguntar por el grupo."
  137.         read -sn 1 -p "S/N " OPC
  138.         clear
  139.     fi
  140. #
  141. #   Al salir del bucle sé que en $GRUPO hay un grupo
  142. #   que existe; y, además, tengo en $IDG el GID de dicho grupo
  143. #
  144. #   Ahora pediremos el nombre y apellido del usuario para
  145. #   el campo comentarios de /etc/passwd. De igual forma
  146. #   que con el grupo, daremos la opción de que tome el nombre
  147. #   de usuario como valor para este campo, lo deje en blanco,
  148. #   o le pida los datos cada vez.
  149. #
  150.     if [ "${OPC2}" != "1" ] && [ "${OPC2}" != "2" ]
  151.         then
  152.         clear
  153.         echo "Ahora podrá incluir el nombre y apellido de $USUARIO"
  154.         echo "en el campo comentario de /etc/passwd; o, si lo prefiere,"
  155.         echo "pulse 1 y todos los usuarios tendrán su nombre de usuario en "
  156.         echo "este campo. Si pulsa 2 dejara el campo en blanco para todos."
  157.         echo 'Pulsando culquier otra tecla se le pedirá el nombre y apellido'
  158.         read -sn 1 -p "Pulse cualquier tecla, 1 o 2: " OPC2
  159.         if [ "${OPC2}" != "1" ] && [ "${OPC2}" != "2" ]
  160.             then
  161.             echo -e "\nIndique ahora el nombre y apellido de $USUARIO"
  162.             read COMENTARIO
  163.         fi
  164.     fi
  165.     case $OPC2 in
  166.         "1" )
  167.         COMENTARIO=$USUARIO;;
  168.         "2" )
  169.         COMENTARIO="";;
  170.     esac
  171. #
  172. #   Le toca el turno al directorio home del usuario. Primero lo
  173. #   crearé y, si todo ha ido bien, añadire su ruta a la variable
  174. #   correspondiente.
  175. #
  176.     mkdir -p /home/$USUARIO
  177.     cp -Raf /etc/skel/* /home/${USUARIO}/
  178.     if ! [ -d /home/$USUARIO ]
  179.         then
  180.         clear
  181.         echo "Se produjo un error al crear el directorio home de $USUARIO"
  182.         echo "Abortando la creación del usuario $USUARIO"
  183.         sleep 2
  184.         continue
  185.     fi
  186.     CASA="/home/${USUARIO}"
  187. #
  188. #   Ya sólo queda construir de forma correcta la línea del nuevo
  189. #   usuario e inyectarla en /etc/passwd (en este caso en la copia de etc/passwd)
  190. #
  191.     echo "${USUARIO}:x:${IDU}:${IDG}:${COMENTARIO}:${CASA}:/bin/bash" >> /etc/passwd
  192. #
  193. #   Ahora ya existe el usuario. Sólo resta cambiar el propietario de
  194. #   su directorio home (que lo ha creado root) al nuevo usuario.
  195. #
  196.     chown -R ${USUARIO}:${GRUPO} /home/$USUARIO
  197. #
  198. #   Fin del bucle que se repetirá tantas veces como usuarios se hayan
  199. #   pasado como parámetros.
  200. #
  201. done
  202. #
  203. #Muestro un resumen final
  204. #
  205. #clear
  206. echo "se han procesado todos los usuarios;"
  207.  
  208.  
  209. read -sn 1 -p "pulse culquier tecla para finalizar" BASURA
  210. clear
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement