viernes, abril 17, 2015

Bash para crear cuentas en vsftpd con mysql

Hace ya bastante tiempo, os enseñe en este blog, como montar un servidor vsftpd en ubuntu. Hace bastante tiempo, decidieron actualizarlo a otra maquina, en concreto una CentOS. Además, la empresa quería montarlo con MySQL, para que el mantenimiento de los usuarios de ftp fuese más fácil.

Pues nada, dicho y hecho. La instalación no difiere mucho de la que ya comente en su momento, una vez instalado este servidor FTP, instalado MySQL, y phpmyadmin, del cual soy superfan, ya solo faltaba incluir los usuarios en la base de datos.

En este ejemplo, los usuarios se encuentran en la carpeta "/var/www/virtual", al estar en la misma máquina la base de datos (bbdd) y el servidor FTP, el host es "localhost", para este ejemplo, los datos de conexion con la bbdd, son usuario: "mi_usuario", bbdd: "mi_bbdd" y la tabla donde se almacenan los usuarios: "usuarios". Como no quería que se guardase la contraseña en el script que no iba a estar encriptado, lo que hice fue un sistema para que el bash preguntase por ella y la guardase para la sesion.

Aparte de para darla de alta, tambien sirve para darla de baja, y configurarla. Espero que se entienda el codigo, sino, me comentais en el blog, o me mandais un correo.

Namaste.


 #!/bin/sh  
 Fecha=$(date +"%d-%m-%y[%H:%M:%S]")  
 #### Defino los parametros de conexión a la BD mysql  
 sql_host="localhost"  
 slq_usuario="mi_usuario"  
 sql_database="mi_bbdd"  
 echo "Selecciona la opcion que mas se adecua a tus necesidades"  
 echo "1) DAR DE ALTA UNA CUENTA FTP"  
 echo "2) DAR DE BAJA UNA CUENTA FTP"  
 echo "3) PERSONALIZAR PERMISOS DE UNA CUENTA"  
 echo "4) salir"  
 read opcion;  
 if [ -z ${opcion} ]  
 then  
      echo "No has introducido un parametro correcto"  
      echo "Se sale del programa"  
      exit  
 fi  
 echo "Escribe la contraseña del usuario ftp de MySQL y pulsa [ENTER]:"  
 read DBPASS  
 if [ -z ${DBPASS} ]  
 then  
      echo "No has introducido la clave de vsftpd de MySQL"  
      echo "Se sale del programa"  
      exit  
 fi  
 case $opcion in  
 # /********************************************  
 #      DAR DE ALTA UNA CUENTA  
 # /********************************************/  
 1)   
 echo "Escribe en el nombre de la cuenta ftp que quieres crear y pulsa [ENTER]:"  
 read EMPRESA  
 if [ -z ${EMPRESA} ];  
 then  
      echo "No has introducido valor para el nombre de la cuenta"  
      echo "Se sale del programa"  
      exit  
 fi  
 echo "Escribe la contraseña de esta cuenta ftp y pulsa [ENTER]:"  
 read PASS  
 if [ -z ${PASS} ];  
 then  
      echo "Has dejado la contraseña en blanco"  
      echo "Se sale del programa"  
      exit  
 fi  
 echo "Creamos una carpeta en donde queremos que el usuario envie/reciba los ficheros"  
 if [ -d /var/www/virtual/${EMPRESA} ];  
 then  
      echo "No se ha podido crear la carpeta en /var/www/virtual/${EMPRESA} porque ya existia."  
 else  
      mkdir /var/www/virtual/${EMPRESA}  
      mkdir /var/www/virtual/${EMPRESA}/carpeta1  
      mkdir /var/www/virtual/${EMPRESA}/carpeta2  
      #Otorgamos permisos adecuados en las carpetas  
      chown -R applftp:applftp /var/www/virtual/${EMPRESA}  
 fi  
 #comprobamos que el usuario no existe  
 RESULTADO=`mysql -h ${sql_host} -u ${slq_usuario} -p${DBPASS} -e"select count(nrregistro) from vsftpd.usuarios where nombre='${EMPRESA}'" | grep -e 0`   
 echo $RESULTADO  
 if [ "$RESULTADO" == "0" ];  
 then  
      echo -e "Añadimos el registro"  
      mysql -h ${sql_host} -u ${slq_usuario} -p${DBPASS} -e "INSERT INTO vsftpd.usuarios (nombre,contrasena,alta,estado ) VALUES ('${EMPRESA}', '${PASS}',NOW(),'0')"  
      echo "salimos de mysql"       
 else  
      echo -e "Ya existe ese usuario. Se procede a reactivarlo y cambiarle la contraseña"  
      mysql -h ${sql_host} -u ${slq_usuario} -p${DBPASS} -e "UPDATE vsftpd.usuarios SET estado=0, contrasena='${PASS}', tipo=CONCAT('reactivado ',NOW()) WHERE nombre='${EMPRESA}'"  
 fi  
 echo "Los datos del servidor son los siguientes:"  
 echo "url: ftp://ftp.tuempresa.com:2021"  
 echo ""   
 echo "Puerto de escucha: 2021"  
 echo ""  
 echo "Tipo de conexion: pasiva"  
 echo "Tipo de servidor: FTPES (FTP sobre TLS/SSL explicito)"  
 echo "Tipo de transferencia: Binaria"  
 echo ""   
 echo "usuario: ${EMPRESA}"  
 echo "password: ${PASS}"  
 ;;  
 # /********************************************  
 #      DAR DE BAJA UNA CUENTA  
 # /********************************************/  
 2)  
 #desactivamos la cuenta en MySQL cambiando el estado  
 echo "Escribe en el nombre de la cuenta ftp que quieres dar de baja y pulsa [ENTER]:"  
 read EMPRESA  
 if [ -z ${EMPRESA} ];  
 then  
      echo "No has introducido valor para el nombre de la cuenta"  
      echo "Se sale del programa"  
      exit  
 fi  
 echo -e "Se procede a desactivar el usuario en la BBDD"  
 RESULTADO=`mysql -h ${sql_host} -u ${slq_usuario} -p${DBPASS} -e "select count(nrregistro) from vsftpd.usuarios where nombre='${EMPRESA}'" | grep -e 0`   
 echo $RESULTADO  
 if [ "$RESULTADO" == "0" ];  
 then  
      echo -e "No se puede dar de baja un usuario que no existia. Se sale del programa"  
      exit  
 else  
      echo -e "Se procede a desactivar el usuario"  
      mysql -h ${sql_host} -u ${slq_usuario} -p${DBPASS} -e "UPDATE vsftpd.usuarios SET estado=1,baja=NOW() WHERE nombre='${EMPRESA}'"  
 fi  
 #si tenia configuracion personalizada, la borramos  
 if [ -f "/etc/vsftpd/usuarios/"${EMPRESA} ]  
 then  
      echo -e "Borrada la configuracion personalizada de este usuario"  
      rm -rf /etc/vsftpd/usuarios/${EMPRESA}  
 else  
      echo "no tenia configuracion personalizada"  
 fi  
 echo "salimos de mysql"  
 #comprimimos los archivos de la carpeta y los borramos  
 if [ -d /var/www/virtual/${EMPRESA} ];  
 then  
      tar -czvf /var/www/virtual/${Fecha}_${EMPRESA}.tar.gz /var/www/virtual/${EMPRESA}  
      mv /var/www/virtual/${Fecha}_${EMPRESA}.tar.gz /etc/vsftpd/usuarios/bajas/  
      rm -rf /var/www/virtual/${EMPRESA}  
      if [ -d /etc/vsftpd/usuarios/${EMPRESA} ];  
      then  
           mv /etc/vsftpd/usuarios/${EMPRESA} /etc/vsftpd/usuarios/___${EMPRESA}  
      else  
           echo "No existia archivo de configuracion personalizado"  
      fi  
 else  
      echo "La carpeta /etc/vsftpd/usuarios/${EMPRESA} no existia. No se ha podido comprimir"   
 fi  
 ;;  
 # /********************************************  
 #      CONFIGURAR CUENTA  
 # /********************************************/  
 3)  
 echo -n "Deseas que la cuenta tenga permisos para borrar? [si o no]: "  
 read yno  
 case $yno in  
     [sS] | [Ss][iI] )  
         echo "Si"  
         echo "Escribe en el nombre de la cuenta para la que quieres personalizar los permisos [ENTER]:"  
           read EMPRESA  
           if [ -z ${EMPRESA} ]  
           then  
                echo "No has introducido valor para el nombre de la cuenta"  
                echo "Se sale del programa"  
                exit  
           fi  
         if [ -d /etc/vsftpd/usuarios/${EMPRESA} ];  
           then  
                echo -e "Ese usuario ya tenia personalizados los permisos. Se sale del programa"  
                exit  
           else  
                echo "write_enable=YES" >> /etc/vsftpd/usuarios/${EMPRESA}  
                echo "anon_upload_enable=YES" >> /etc/vsftpd/usuarios/${EMPRESA}  
                echo "anon_other_write_enable=YES" >> /etc/vsftpd/usuarios/${EMPRESA}  
                echo "local_umask=777" >> /etc/vsftpd/usuarios/${EMPRESA}  
                echo -n "Quieres que entre en otro directorio? [si or no]: "  
                read sino  
                case $sino in  
                     [sS] | [Ss][iI])  
                          echo "Si"  
                          echo "Escribe en el nombre de la cuenta donde quieres que se conecte el usuario [ENTER]:"  
                          read USUARIO  
                          if [ -z ${USUARIO} ]  
                          then  
                               echo "No has introducido el nombre de la cuenta"  
                               echo "Se sale del programa"  
                               exit  
                          fi  
                          if [ -f /etc/vsftpd/usuarios/${EMPRESA} ];  
                          then  
                               echo "local_root=/var/www/virtual/${USUARIO}/" >> /etc/vsftpd/usuarios/${EMPRESA}  
                          else  
                               echo "no lo he podido cambiar"  
                          exit  
                          fi  
                          ;;  
                     [nN] | [nN][Oo])  
                          echo "No. Se sale de la aplicacion.";  
                          exit  
                          ;;  
                     *) echo "Invalid input"  
                       ;;  
                esac  
           fi  
         ;;  
     [nN] | [Nn][Oo] )  
         echo "Not agreed, you can't proceed the installation";  
         exit 1  
         ;;  
     *) echo "Invalid input"  
       ;;  
 esac  
 ;;  
 ## /********************************************  
 ##      SALIR DEL PROGRAMA  
 ## /********************************************/  
 #  
 *) echo "Se sale del programa"  
 exit  
 ;;  
 esac  

No hay comentarios:

Publicar un comentario

Los comentarios se mostrarán una vez aprobados