userspanel.sh 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. #!/bin/bash
  2. #Guzmán Castanedo (guzman@castanedo.es) Octubre 2017
  3. #Licencia: GPL3 (http://www.gnu.org/licenses/gpl-3.0.html)
  4. function comprobarPrivilegios {
  5. #Comprobar si somos root.
  6. if [ $(id -u) -ne 0 ]; then
  7. #No somos root
  8. printf "\tERROR: No es posible obtener permisos de root.\n"
  9. exit 1
  10. fi
  11. }
  12. function mostrarBienvenida {
  13. #Version y ayuda.
  14. printf "$(basename $0) $VERSION\n"
  15. printf "Escribir \"ayuda\" o \"help\" para obtener ayuda de los comandos\n\n"
  16. }
  17. function leerComando {
  18. #Muestrar linea de comando y capturar comando.
  19. force=false
  20. remove=false
  21. printf "$(basename $0)> "
  22. read Comando
  23. #Parseamos la linea de comando con todas las opciones posibles.
  24. #printf "$Comando\n"
  25. Temp=$(getopt -q -o d:g:G:p:s:fre: --long home-dir:,gid:,groups:,password:,shell:,force,remove,expiredate: -- $Comando)
  26. eval set -- "$Temp"
  27. #printf "$Temp\n"
  28. while true; do
  29. case "$1" in
  30. -d|--home-dir)
  31. homeDir=$2
  32. shift 2
  33. ;;
  34. -g|--gid)
  35. gid=$2
  36. shift 2
  37. ;;
  38. -G|--groups)
  39. otherGroups=$2
  40. shift 2
  41. ;;
  42. -p|--password)
  43. password=$2
  44. shift 2
  45. ;;
  46. -s|--shell)
  47. shell=$2
  48. shift 2
  49. ;;
  50. -f|--force)
  51. force=true
  52. shift
  53. ;;
  54. -r|--remove)
  55. remove=true
  56. shift
  57. ;;
  58. -e|--expiredate)
  59. expireDate=$2
  60. shift 2
  61. ;;
  62. --)
  63. shift
  64. break
  65. ;;
  66. *)
  67. printf "Error de Sintaxis: Comando no valido.\n"
  68. return 1
  69. ;;
  70. esac
  71. done
  72. Opcion=$1
  73. User=$2
  74. #printf "Opcion: $Opcion\tUsuario: $User\n"
  75. unset Comando Temp
  76. }
  77. function altaUsuario {
  78. #Crea el usuario si no existe.
  79. #Comprobaciones
  80. if [ -z $User ]; then
  81. #Usuario no definido
  82. printf "(USUARIO)> "
  83. read User
  84. fi
  85. existeUsuario
  86. if [ $? -eq 0 ]; then
  87. #Ya existe
  88. printf "ERROR: El usuario no esta disponible (ya existe).\n"
  89. printf "\tEscribir \"usuarios\" para mostrar usuarios disponibles.\n"
  90. return 1
  91. fi
  92. if [ -z $homeDir ]; then
  93. printf "(HOME_DIR)> "
  94. read homeDir
  95. fi
  96. opciones="-m -d $homeDir"
  97. if [ -z $gid ]; then
  98. printf "(GROUP)> "
  99. read gid
  100. fi
  101. existeGrupo $gid
  102. if [ $? -ne 0 ]; then
  103. #No existe grupo. Vamos a crearlo
  104. crearGrupo $gid
  105. if [ $? -ne 0 ]; then
  106. printf "ERROR FATAL: No se puede crear grupo.\n"
  107. return 1
  108. fi
  109. fi
  110. opciones=$opciones" -g $gid"
  111. if [ ! -z $otherGroups ]; then
  112. opciones=$opciones" -G $otherGroups"
  113. fi
  114. if [ -z $password ]; then
  115. leerPassword
  116. fi
  117. #opciones=$opciones" -p $password"
  118. if [ -z $shell ]; then
  119. printf "Shells disponibles:\n"
  120. for linea in $(grep -v "#" /etc/shells); do
  121. printf "\t$linea\n"
  122. done
  123. printf "\t/usr/sbin/nologin\n\t/bin/false\n"
  124. printf "(SHELL)> "
  125. read shell
  126. unset linea
  127. fi
  128. if [ ! -x $shell ]; then
  129. printf "ERROR: El shell $shell no esta disponible.\n"
  130. return 1
  131. fi
  132. opciones=$opciones" -s $shell"
  133. #Todo correcto. Ejecutamos useradd
  134. printf "Resumen:\n"
  135. printf "\tUSUARIO:\t$User\n"
  136. printf "\tHOMEDIR:\t$(realpath $homeDir)\n"
  137. printf "\tGROUP:\t\t$gid\n"
  138. printf "\tGRUPOS ADIC.:\t$otherGroups\n"
  139. printf "\tSHELL:\t\t$shell\n"
  140. printf "(Es correcto? [S/N])> "
  141. read correcto
  142. case $correcto in
  143. y|Y|s|S)
  144. #Correcto
  145. unset correcto
  146. ;;
  147. *)
  148. printf "Cancelado por el Usuario.\n"
  149. return 1
  150. ;;
  151. esac
  152. #printf "useradd $opciones $User\n"
  153. useradd $opciones $User
  154. if [ $? -ne 0 ]; then
  155. printf "ERROR FATAL: No se ha podido crear el usuario.\n"
  156. return 1
  157. fi
  158. #Cambiamos password de usuario
  159. printf "$password\n$password\n" | passwd $User >/dev/null 2>&1
  160. if [ $? -ne 0 ]; then
  161. printf "ERROR: al establecer contraseña (usuario creado).\n"
  162. return 1
  163. fi
  164. return 0
  165. }
  166. function bajaUsuario {
  167. #Eliminar usuario si existe
  168. if [ -z $User ]; then
  169. listarUsuarios
  170. printf "(USUARIO)> "
  171. read User
  172. fi
  173. existeUsuario
  174. if [ $? -ne 0 ]; then
  175. printf "ERROR: no existe el usuario $User.\n"
  176. printf "\tEscribir \"usuarios\" para mostrar usuarios disponibles.\n"
  177. return 1
  178. fi
  179. opciones=""
  180. if [ $force = true ]; then
  181. opciones=$opciones" -f"
  182. fi
  183. if [ $remove = true ]; then
  184. opciones=$opciones" -r"
  185. fi
  186. printf "(QUIERES ELIMINAR A $User? [Y/N])> "
  187. read correcto
  188. case $correcto in
  189. y|Y|s|S)
  190. unset correcto
  191. ;;
  192. *)
  193. printf "Cancelado por el Usuario.\n"
  194. return 1
  195. ;;
  196. esac
  197. #printf "userdel$opciones $User\n"
  198. userdel$opciones $User
  199. return 0
  200. }
  201. function cambiarPassword {
  202. #Cambiamos la contraseña del usuario ($User)
  203. if [ -z $User ]; then
  204. listarUsuarios
  205. printf "(USUARIO)> "
  206. read User
  207. fi
  208. existeUsuario
  209. if [ $? -ne 0 ]; then
  210. printf "ERROR: el usuario $User no existe.\n"
  211. printf "\tEscribir \"usuarios\" para mostrar usuarios disponibles.\n"
  212. return 1
  213. fi
  214. if [ -z $password ]; then
  215. leerPassword
  216. fi
  217. printf "$password\n$password\n" | passwd $User >/dev/null 2>&1
  218. if [ $? -ne 0 ]; then
  219. printf "ERROR FATAL: No es posible cambiar la contraseña.\n"
  220. return 1
  221. fi
  222. return 0
  223. }
  224. function listarUsuarios {
  225. #Listamos los usuarios que hay en el sistema.
  226. printf "Usuarios disponibles:\n"
  227. for lista in $(cat /etc/passwd | cut -d: -f1); do
  228. printf "$lista\t"
  229. done
  230. printf "\n"
  231. unset lista
  232. }
  233. function bloquearUsuario {
  234. #Bloquea el usuario $User
  235. if [ -z $User ]; then
  236. listarUsuarios
  237. printf "(USUARIO)> "
  238. read User
  239. fi
  240. existeUsuario
  241. if [ $? -ne 0 ]; then
  242. printf "ERROR: el usuario $User no existe.\n"
  243. printf "\tEscribir \"usuarios\" para mostrar usuarios disponibles.\n"
  244. return 1
  245. fi
  246. #estaBloqueado
  247. #if [ $? -eq 0 ]; then
  248. # printf "$User ya esta bloqueado (%s).\n" $(fechaBloqueado)
  249. # printf "Escribir \"desbloquear\" para desbloquear usuario.\n"
  250. # return 1
  251. #fi
  252. if [ -z $expireDate ]; then
  253. printf "(FECHA BLOQUEO [yyyy-mm-dd])> "
  254. read expireDate
  255. case $expireDate in
  256. ""|now|NOW)
  257. expireDate=1
  258. ;;
  259. *)
  260. ;;
  261. esac
  262. fi
  263. usermod -e $expireDate $User
  264. if [ $? -ne 0 ]; then
  265. printf "ERROR FATAL: No se ha podido bloquear usuario $User.\n"
  266. return 1
  267. fi
  268. return 0
  269. }
  270. function desbloquearUsuario {
  271. #Desbloquear el usuario $User
  272. if [ -z $User ]; then
  273. listarUsuarios
  274. printf "(USUARIO)> "
  275. read User
  276. fi
  277. existeUsuario
  278. if [ $? -ne 0 ]; then
  279. printf "ERROR: el usuario $User no existe.\n"
  280. printf "\tEscribir \"usuarios\" para mostrar usuarios disponibles.\n"
  281. return 1
  282. fi
  283. estaBloqueado
  284. if [ $? -ne 0 ]; then
  285. printf "$User no esta bloqueado.\n"
  286. printf "Escribir \"bloquear\" para desbloquear usuario.\n"
  287. return 1
  288. fi
  289. printf "Fecha de Bloqueo de $User: %s\n" $(fechaBloqueado)
  290. printf "(DESBLOQUEAR? [S/N])> "
  291. read correcto
  292. case $correcto in
  293. y|Y|s|S)
  294. ;;
  295. *)
  296. printf "Cancelado por el Usuario.\n"
  297. return 1
  298. ;;
  299. esac
  300. usermod -e "" $User
  301. if [ $? -ne 0 ]; then
  302. printf "ERROR FATAL: No se ha podido desbloquear usuario $User.\n"
  303. return 1
  304. fi
  305. return 0
  306. }
  307. function estaBloqueado {
  308. #Comprueba si el usuario $User esta bloqueado (Usando Dias UNIX)
  309. ahora=$(expr $(date --utc -d now +%s) / 86400)
  310. locktime=$(grep ^$User: /etc/shadow | cut -d: -f8)
  311. #printf "Ahora: $ahora\nLock: $locktime\n"
  312. if [ -z $locktime ]; then
  313. #No esta bloqueado
  314. return 1
  315. fi
  316. if [ $locktime -le $ahora ]; then
  317. #Esta bloqueado
  318. return 0
  319. else
  320. #No lo esta, pero sí lo hara en el futuro
  321. #CAMBIO: considero que esta BLOQUEADO aunque SEA EN EL FUTURO
  322. return 0
  323. fi
  324. }
  325. function fechaBloqueado {
  326. #Muestra la fecha de bloqueo en formato humano yyyy-mm-dd
  327. locktime=$(expr $(grep ^$User: /etc/shadow | cut -d: -f8) '*' 86400)
  328. fecha=$(date -d @$locktime +%F)
  329. printf "$fecha\n"
  330. }
  331. function leerPassword {
  332. #Lee contraseña y la guarda en $password
  333. igual=false
  334. while [ $igual = false ]; do
  335. printf "(PASSWORD)> "
  336. read -s password
  337. printf "\n(Confirme PASSWORD)> "
  338. read -s password2
  339. printf "\n"
  340. if [ $password = $password2 ]; then
  341. igual=true
  342. else
  343. printf "ERROR: No coinciden. Vuelva a intentarlo.\n"
  344. fi
  345. done
  346. unset igual password2
  347. }
  348. function existeUsuario {
  349. #Comprobamos si un usuario ($User) existe
  350. cat /etc/passwd | cut -d: -f1 | grep ^$User$ > /dev/null 2>&1
  351. return $?
  352. }
  353. function existeGrupo {
  354. #Comprobamos si el grupo ($1) existe
  355. cat /etc/group | cut -d: -f1 | grep ^$1$ > /dev/null 2>&1
  356. return $?
  357. }
  358. function crearGrupo {
  359. #Crea el grupo $1
  360. groupadd $1 > /dev/null 2>&1
  361. return $?
  362. }
  363. function ayuda {
  364. #Muestra la ayuda dependiendo del caso en el que estemos.
  365. printf "ayuda $1\n"
  366. case "$1" in
  367. alta)
  368. printf "alta: Dar de ALTA un nuevo usuario\n"
  369. printf "SINOPSIS: alta [OPCIONES] [user]\n"
  370. printf "OPCIONES:\n"
  371. printf "\t-d, --home-dir HOME_DIR\n"
  372. printf "\t\tDirectorio personal del usuario (HOME_DIR).\n"
  373. printf "\t-g, --gid GROUP\n"
  374. printf "\t\tNombre del grupo principal para el usuario.\n"
  375. printf "\t-G, --groups GROUP1[,GROUP2[,...[,GROUPN]]]\n"
  376. printf "\t\tGrupos adicionales para el usuario.\n"
  377. printf "\t-p, --pasword\n"
  378. printf "\t\tContraseña del usuario.\n"
  379. printf "\t-s, --shell SHELL\n"
  380. printf "\t\tShell del usuario.\n"
  381. ;;
  382. cambiar)
  383. printf "cambiar: CAMBIAR contraseña de un usuario:\n"
  384. printf "SINOPSIS: cambiar [user]\n"
  385. printf "\t-p, --pasword\n"
  386. printf "\t\tContraseña del usuario.\n"
  387. ;;
  388. baja)
  389. printf "baja: Dar de BAJA un usuario\n"
  390. printf "SINOPSIS: baja [OPCIONES] [user]\n"
  391. printf "OPCIONES:\n"
  392. printf "\t-f, --force\n"
  393. printf "\t\tElimina incluso si está logeado y elimina el directorio\n"
  394. printf "\t\tpersonal del usuario y su mail.\n"
  395. printf "\t-r, --remove\n"
  396. printf "\t\tElimina el directorio personal del usuario y su mail.\n"
  397. ;;
  398. bloquear)
  399. printf "bloquear: BLOQUEAR un usuario\n"
  400. printf "SINOPSIS: bloquear [OPCIONES] [usuario]\n"
  401. printf "OPCIONES:\n"
  402. printf "\t-e, --expiredate EXPIRE_DATE\n"
  403. printf "\t\tFecha el formato YYYY-MM-DD en el que el usuario se bloqueara.\n"
  404. printf "\t\tPor defecto: 1970-01-02 (siempre se bloquea).\n"
  405. ;;
  406. desbloquear)
  407. printf "desbloquear: DESBLOQUEAR un usuario\n"
  408. printf "SINOPSIS: desbloquear [usuario]\n"
  409. ;;
  410. ""|ayuda|help)
  411. printf "COMANDOS:\n"
  412. printf "> alta\t\tDar de ALTA un nuevo usuario\n"
  413. printf "> cambiar\tCAMBIAR contraseña de un usuario\n"
  414. printf "> baja\t\tDar de BAJA un usuario\n"
  415. printf "> bloquear\tBLOQUEAR un usuario\n"
  416. printf "> desbloquear\tDESBLOQUEAR un usuario\n"
  417. printf "> usuarios\tListar USUARIOS en el sistema\n"
  418. printf "> ayuda\t\tMuestra esta ayuda\n"
  419. printf "\t\tPara mas ayuda escribir \"ayuda [comando]\"\n"
  420. printf "> salir\t\tFinaliza programa\n"
  421. ;;
  422. usuarios)
  423. printf "usuarios: muestra los usuarios disponibles\n"
  424. printf "SINOPSIS: usuarios\n"
  425. ;;
  426. salir|s|S|quit|q|Q|exit)
  427. printf "salir: finaliza el programa\n"
  428. printf "SINOPSIS: salir, s, S, quit, q, Q, exit\n"
  429. ;;
  430. *)
  431. printf "Error: el comando $1 no existe.\n"
  432. #printf "Escriba \"ayuda\" o \"help\" ver los posibles comandos.\n"
  433. ayuda
  434. ;;
  435. esac
  436. }
  437. VERSION="0.3 Beta"
  438. comprobarPrivilegios
  439. mostrarBienvenida
  440. cont=true
  441. while [ $cont = true ]; do
  442. leerComando
  443. case $Opcion in
  444. alta)
  445. #Alta usuario
  446. altaUsuario
  447. if [ $? -eq 0 ]; then
  448. printf "USUARIO $User CREADO CON EXITO.\n"
  449. fi
  450. ;;
  451. cambiar)
  452. #Cambiar passwd
  453. cambiarPassword
  454. if [ $? -eq 0 ]; then
  455. printf "PASSWORD DEL USUARIO $User CAMBIADO CON EXITO.\n"
  456. fi
  457. ;;
  458. baja)
  459. #Baja usuario
  460. bajaUsuario
  461. if [ $? -eq 0 ]; then
  462. printf "USUARIO $User ELIMINADO CON EXITO.\n"
  463. fi
  464. ;;
  465. bloquear)
  466. #Bloquear usuario
  467. bloquearUsuario
  468. if [ $? -eq 0 ]; then
  469. printf "USUARIO $User BLOQUEADO CON EXITO.\n"
  470. fi
  471. ;;
  472. desbloquear)
  473. #Desbloquear usuario
  474. desbloquearUsuario
  475. if [ $? -eq 0 ]; then
  476. printf "USUARIO $User DESBLOQUEADO CON EXITO.\n"
  477. fi
  478. ;;
  479. usuarios)
  480. #Lista todos los usuarios existentes
  481. listarUsuarios
  482. ;;
  483. ayuda|help)
  484. #Ayuda de comandos
  485. ayuda $User
  486. ;;
  487. salir|s|S|quit|q|Q|exit)
  488. #Salida
  489. #Podreamos hacer break, pero los bucles infinitos son feos.
  490. cont=false
  491. ;;
  492. *)
  493. #Opcion Incorrecta
  494. printf "Error de Sintaxis: Comando no valido.\n"
  495. ayuda
  496. ;;
  497. esac
  498. unset Opcion User homeDir gid otherGroups password shell force remove expireDate opciones correcto
  499. done
  500. unset VERSION cont
  501. exit