Explorar el Código

userspanel.sh Version 0.1

Guzmán Castanedo Villalba hace 6 años
padre
commit
815f661346
Se han modificado 1 ficheros con 517 adiciones y 0 borrados
  1. 517 0
      userspanel.sh

+ 517 - 0
userspanel.sh

@@ -0,0 +1,517 @@
+#!/bin/bash
+#Guzmán Castanedo (guzman@castanedo.es) Octubre 2017
+#Licencia: GPL3 (http://www.gnu.org/licenses/gpl-3.0.html)
+
+function comprobarPrivilegios {
+#Comprobar si somos root.
+	if [ $(id -u) -ne 0 ]; then
+		 #No somos root
+		 printf "\tERROR: No es posible obtener permisos de root.\n"
+		 exit 1
+	fi
+}
+
+function mostrarBienvenida {
+#Version y ayuda.
+	printf "$(basename $0) $VERSION\n"
+	printf "Escribir \"ayuda\" o \"help\" para obtener ayuda de los comandos\n\n"
+}
+
+function leerComando {
+#Muestrar linea de comando y capturar comando.
+	force=false
+	remove=false
+	printf "$(basename $0)> "
+	read Comando
+	#Parseamos la linea de comando con todas las opciones posibles.
+	#printf "$Comando\n"
+	Temp=$(getopt -q -o d:g:G:p:s:fre: --long home-dir:,gid:,groups:,password:,shell:,force,remove,expiredate: -- $Comando)
+	eval set -- "$Temp"
+	#printf "$Temp\n"
+	while true; do
+		case "$1" in
+			-d|--home-dir)
+				homeDir=$2
+				shift 2
+				;;
+			-g|--gid)
+				gid=$2
+				shift 2
+				;;
+			-G|--groups)
+				otherGroups=$2
+				shift 2
+				;;
+			-p|--password)
+				password=$2
+				shift 2
+				;;
+			-s|--shell)
+				shell=$2
+				shift 2
+				;;
+			-f|--force)
+				force=true
+				shift
+				;;
+			-r|--remove)
+				remove=true
+				shift
+				;;
+			-e|--expiredate)
+				expireDate=$2
+				shift 2
+				;;
+			--)
+				shift	
+				break
+				;;
+			*)
+				printf "Error de Sintaxis: Comando no valido.\n"
+				return 1
+				;;
+		esac
+	done
+	Opcion=$1
+	User=$2
+	#printf "Opcion: $Opcion\tUsuario: $User\n"
+	unset Comando Temp
+}
+
+function altaUsuario {	
+#Crea el usuario si no existe.
+	#Comprobaciones
+	if [ -z $User ]; then
+		#Usuario no definido
+		printf "(USUARIO)> "
+		read User
+	fi
+	existeUsuario
+	if [ $? -eq 0 ]; then
+		#Ya existe
+		printf "ERROR: El usuario no esta disponible (ya existe).\n"
+		printf "\tEscribir \"usuarios\" para mostrar usuarios disponibles.\n"
+		return 1
+	fi
+	if [ -z $homeDir ]; then
+		printf "(HOME_DIR)> "
+		read homeDir
+	fi
+	opciones="-m -d $homeDir"
+	if [ -z $gid ]; then
+		printf "(GROUP)> "
+		read gid
+	fi
+	existeGrupo $gid
+	if [ $? -ne 0 ]; then
+		#No existe grupo. Vamos a crearlo
+		crearGrupo $gid
+		if [ $? -ne 0 ]; then
+			printf "ERROR FATAL: No se puede crear grupo.\n"
+			return 1
+		fi
+	fi
+	opciones=$opciones" -g $gid"
+	if [ ! -z $otherGroups ]; then
+		opciones=$opciones" -G $otherGroups"
+	fi
+	if [ -z $password ]; then
+		leerPassword
+	fi
+	#opciones=$opciones" -p $password"
+	if [ -z $shell ]; then
+		printf "Shells disponibles:\n"
+		for linea in $(grep -v "#" /etc/shells); do
+			printf "\t$linea\n"
+		done
+		printf "\t/usr/sbin/nologin\n\t/bin/false\n"
+		printf "(SHELL)> "
+		read shell
+		unset linea
+	fi
+	if [ ! -x $shell ]; then
+		printf "ERROR: El shell $shell no esta disponible.\n"
+		return 1
+	fi
+	opciones=$opciones" -s $shell"
+	#Todo correcto. Ejecutamos useradd
+	printf "Resumen:\n"
+	printf "\tUSUARIO:\t$User\n"
+	printf "\tHOMEDIR:\t$(realpath $homeDir)\n"
+	printf "\tGROUP:\t\t$gid\n"
+	printf "\tGRUPOS ADIC.:\t$otherGroups\n"
+	printf "\tSHELL:\t\t$shell\n"
+	printf "(Es correcto? [S/N])> "
+	read correcto
+	case $correcto in
+		y|Y|s|S)
+			 #Correcto
+			 unset correcto
+			;;
+		*)
+			printf "Cancelado por el Usuario.\n"
+			return 1
+			;;
+	esac
+	#printf "useradd $opciones $User\n"
+	useradd $opciones $User
+	if [ $? -ne 0 ]; then
+		printf "ERROR FATAL: No se ha podido crear el usuario.\n"
+		return 1
+	fi
+	#Cambiamos usuario
+	printf "$password\n$password\n" | passwd $User >/dev/null 2>&1
+	if [ $? -ne 0 ]; then
+		printf "ERROR: al establecer contraseña (usuario creado).\n"
+		return 1
+	fi
+	return 0
+}
+
+function bajaUsuario {
+#Eliminar usuario si existe
+	if [ -z $User ]; then
+		listarUsuarios
+		printf "(USUARIO)> "
+		read User
+	fi
+	existeUsuario
+	if [ $? -ne 0 ]; then
+		printf "ERROR: no existe el usuario $User.\n"
+		printf "\tEscribir \"usuarios\" para mostrar usuarios disponibles.\n"
+		return 1
+	fi
+	opciones=""
+	if [ $force = true ]; then
+		opciones=$opciones" -f"
+	fi
+	if [ $remove = true ]; then
+		opciones=$opciones" -r"
+	fi
+	printf "(QUIERES ELIMINAR A $User? [Y/N])> "
+	read correcto
+	case $correcto in
+		y|Y|s|S)
+			unset correcto
+			;;
+		*)
+			printf "Cancelado por el Usuario.\n"
+			return 1
+			;;
+	esac
+	#printf "userdel$opciones $User\n"
+	userdel$opciones $User
+	return 0
+}
+
+function cambiarPassword {
+#Cambiamos la contraseña del usuario ($User)
+	if [ -z $User ]; then
+		listarUsuarios
+		printf "(USUARIO)> "
+		read User
+	fi
+	existeUsuario
+	if [ $? -ne 0 ]; then
+		printf "ERROR: el usuario $User no existe.\n"
+		printf "\tEscribir \"usuarios\" para mostrar usuarios disponibles.\n"
+		return 1
+	fi
+	if [ -z $password ]; then
+		leerPassword
+	fi
+	printf "$password\n$password\n" | passwd $User >/dev/null 2>&1
+	if [ $? -ne 0 ]; then
+		printf "ERROR FATAL: No es posible cambiar la contraseña.\n"
+		return 1
+	fi
+	return 0
+}
+
+function listarUsuarios {
+#Listamos los usuarios que hay en el sistema.
+	printf "Usuarios disponibles:\n"
+	for lista in $(cat /etc/passwd | cut -d: -f1); do
+		printf "$lista\t"
+	done
+	printf "\n"
+	unset lista
+}
+
+function bloquearUsuario {
+#Bloquea el usuario $User
+	if [ -z $User ]; then
+		listarUsuarios
+		printf "(USUARIO)> "
+		read User
+	fi
+	existeUsuario
+	if [ $? -ne 0 ]; then
+		printf "ERROR: el usuario $User no existe.\n"
+		printf "\tEscribir \"usuarios\" para mostrar usuarios disponibles.\n"
+		return 1
+	fi
+	estaBloqueado
+	if [ $? -eq 0 ]; then
+		printf "$User ya esta bloqueado (%s).\n" $(fechaBloqueado)
+		printf "Escribir \"desbloquear\" para desbloquear usuario.\n"
+		return 1
+	fi
+	if [ -z $expireDate ]; then
+		printf "(FECHA BLOQUEO [yyyy-mm-dd])> "
+		read expireDate
+		case $expireDate in
+			""|now|NOW)
+				expireDate=1
+				;;
+			*)
+				;;
+		esac
+	fi
+	usermod -e $expireDate $User
+	if [ $? -ne 0 ]; then
+		printf "ERROR FATAL: No se ha podido bloquear usuario $User.\n"
+		return 1
+	fi
+	return 0
+}
+
+function desbloquearUsuario {
+#Desbloquear el usuario $User
+	if [ -z $User ]; then
+		listarUsuarios
+		printf "(USUARIO)> "
+		read User
+	fi
+	existeUsuario
+	if [ $? -ne 0 ]; then
+		printf "ERROR: el usuario $User no existe.\n"
+		printf "\tEscribir \"usuarios\" para mostrar usuarios disponibles.\n"
+		return 1
+	fi
+	estaBloqueado
+	if [ $? -ne 0 ]; then
+		printf "$User no esta bloqueado.\n"
+		printf "Escribir \"bloquear\" para desbloquear usuario.\n"
+		return 1
+	fi
+	printf "Fecha de Bloqueo de $User: %s\n" $(fechaBloqueado)
+	printf "(DESBLOQUEAR? [S/N])> "
+	read correcto
+	case $correcto in
+		y|Y|s|S)
+			;;
+		*)
+			printf "Cancelado por el Usuario.\n"
+			return 1
+			;;
+	esac
+	usermod -e "" $User
+	if [ $? -ne 0 ]; then
+		printf "ERROR FATAL: No se ha podido desbloquear usuario $User.\n"
+		return 1
+	fi
+	return 0
+}
+
+function estaBloqueado {
+#Comprueba si el usuario $User esta bloqueado (Usando Dias UNIX)
+	ahora=$(expr $(date --utc -d now +%s) / 86400)
+	locktime=$(grep ^$User: /etc/shadow | cut -d: -f8)
+	#printf "Ahora: $ahora\nLock: $locktime\n"
+	if [ -z $locktime ]; then
+		#No esta bloqueado
+		return 1
+	fi
+	if [ $locktime -le $ahora ]; then
+		#Esta bloqueado
+		return 0
+	else
+		#No lo esta
+		return 1
+	fi
+}
+
+function fechaBloqueado {
+#Muestra la fecha de bloqueo en formato humano yyyy-mm-dd
+	locktime=$(expr $(grep ^$User: /etc/shadow | cut -d: -f8) '*' 86400)
+	fecha=$(date -d @$locktime +%F)
+	printf "$fecha\n"
+}
+
+function leerPassword {
+#Lee contraseña y la guarda en $password
+	igual=false
+		while [ $igual = false ]; do
+			printf "(PASSWORD)> "
+			read -s password
+			printf "\n(Confirme PASSWORD)> "
+			read -s password2
+			printf "\n"
+			if [ $password = $password2 ]; then
+				igual=true
+			else
+				printf "ERROR: No coinciden. Vuelva a intentarlo.\n"
+			fi
+		done
+		unset igual password2
+}
+
+function existeUsuario {
+	#Comprobamos si un usuario ($User) existe
+	cat /etc/passwd | cut -d: -f1 | grep ^$User$ > /dev/null 2>&1
+	return $?
+}
+
+function existeGrupo {
+	#Comprobamos si el grupo ($1) existe
+	cat /etc/group | cut -d: -f1 | grep ^$1$ > /dev/null 2>&1
+	return $?
+}
+
+function crearGrupo {
+	#Crea el grupo $1
+	groupadd $1 > /dev/null 2>&1
+	return $?
+}
+
+function ayuda {
+#Muestra la ayuda dependiendo del caso en el que estemos.
+	printf "ayuda $1\n"
+	case "$1" in
+		alta)
+			printf "alta: Dar de ALTA un nuevo usuario\n"
+			printf "SINOPSIS: alta [OPCIONES] [user]\n"
+			printf "OPCIONES:\n"
+			printf "\t-d, --home-dir HOME_DIR\n"
+			printf "\t\tDirectorio personal del usuario (HOME_DIR).\n"
+			printf "\t-g, --gid GROUP\n"
+			printf "\t\tNombre del grupo principal para el usuario.\n"
+			printf "\t-G, --groups GROUP1[,GROUP2[,...[,GROUPN]]]\n"
+			printf "\t\tGrupos adicionales para el usuario.\n"
+			printf "\t-p, --pasword\n"
+			printf "\t\tContraseña del usuario.\n"
+			printf "\t-s, --shell SHELL\n"
+			printf "\t\tShell del usuario.\n"
+			;;
+		cambiar)
+			printf "cambiar: CAMBIAR contraseña de un usuario:\n"
+			printf "SINOPSIS: cambiar [user]\n"
+			printf "\t-p, --pasword\n"
+			printf "\t\tContraseña del usuario.\n"
+			;;
+		baja)
+			printf "baja: Dar de BAJA un usuario\n"
+			printf "SINOPSIS: baja [OPCIONES] [user]\n"
+			printf "OPCIONES:\n"
+			printf "\t-f, --force\n"
+			printf "\t\tElimina incluso si está logeado y elimina el directorio\n"
+			printf "\t\tpersonal del usuario y su mail.\n"
+			printf "\t-r, --remove\n"
+			printf "\t\tElimina el directorio personal del usuario y su mail.\n"
+			;;
+		bloquear)
+			printf "bloquear: BLOQUEAR un usuario\n"
+			printf "SINOPSIS: bloquear [OPCIONES] [usuario]\n"
+			printf "OPCIONES:\n"
+			printf "\t-e, --expiredate EXPIRE_DATE\n"
+			printf "\t\tFecha el formato YYYY-MM-DD en el que el usuario se bloqueara.\n"
+			printf "\t\tPor defecto: 1970-01-02 (siempre se bloquea).\n"
+			;;
+		desbloquear)
+			printf "desbloquear: DESBLOQUEAR un usuario\n"
+			printf "SINOPSIS: desbloquear [usuario]\n"
+			;;
+		""|ayuda|help)
+			printf "COMANDOS:\n"
+			printf "> alta\t\tDar de ALTA un nuevo usuario\n"
+			printf "> cambiar\tCAMBIAR contraseña de un usuario\n"
+			printf "> baja\t\tDar de BAJA un usuario\n"
+			printf "> bloquear\tBLOQUEAR un usuario\n"
+			printf "> desbloquear\tDESBLOQUEAR un usuario\n"
+			printf "> usuarios\tListar USUARIOS en el sistema\n"
+			printf "> ayuda\t\tMuestra esta ayuda\n"
+			printf "\t\tPara mas ayuda escribir \"ayuda [comando]\"\n"
+			printf "> salir\t\tFinaliza programa\n"
+			;;
+		usuarios)
+			printf "usuarios: muestra los usuarios disponibles\n"
+			printf "SINOPSIS: usuarios\n"
+			;;
+		salir|s|S|quit|q|Q|exit)
+			printf "salir: finaliza el programa\n"
+			printf "SINOPSIS: salir, s, S, quit, q, Q, exit\n"
+			;;
+		*)
+			printf "Error: el comando $1 no existe.\n"
+			#printf "Escriba \"ayuda\" o \"help\" ver los posibles comandos.\n"
+			ayuda
+			;;
+	esac
+}
+
+VERSION="0.1 Beta"
+comprobarPrivilegios
+mostrarBienvenida
+cont=true
+while [ $cont = true ]; do
+	leerComando
+	case $Opcion in
+		alta)
+			#Alta usuario
+			altaUsuario
+			if [ $? -eq 0 ]; then
+				printf "USUARIO $User CREADO CON EXITO.\n"
+			fi
+			;;
+		cambiar)
+			#Cambiar passwd
+			cambiarPassword
+			if [ $? -eq 0 ]; then
+				printf "PASSWORD DEL USUARIO $User CAMBIADO CON EXITO.\n"
+			fi
+			;;
+		baja)
+			#Baja usuario
+			bajaUsuario
+			if [ $? -eq 0 ]; then
+				printf "USUARIO $User ELIMINADO CON EXITO.\n"
+			fi
+			;;
+		bloquear)
+			#Bloquear usuario
+			bloquearUsuario
+			if [ $? -eq 0 ]; then
+				printf "USUARIO $User BLOQUEADO CON EXITO.\n"
+			fi
+			;;
+		desbloquear)
+			#Desbloquear usuario
+			desbloquearUsuario
+			if [ $? -eq 0 ]; then
+				printf "USUARIO $User DESBLOQUEADO CON EXITO.\n"
+			fi
+			;;
+		usuarios)
+			#Lista todos los usuarios existentes
+			listarUsuarios
+			;;
+		ayuda|help)
+			#Ayuda de comandos
+			ayuda $User
+			;;
+		salir|s|S|quit|q|Q|exit)
+			#Salida
+			#Podreamos hacer break, pero los bucles infinitos son feos.
+			cont=false
+			;;
+		*)
+			#Opcion Incorrecta
+			printf "Error de Sintaxis: Comando no valido.\n"
+			ayuda
+			;;
+	esac
+	unset Opcion User homeDir gid otherGroups password shell force remove expireDate opciones correcto
+done
+unset VERSION cont
+exit