edumgui

User_Connection&Actions_stats

Dec 27th, 2017
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 5.88 KB | None | 0 0
  1. #!/bin/bash
  2. # Creamos la carpeta para los informes
  3. mkdir -p /root/informes
  4.  
  5. # Guardamos las variables para utilizarlas en el cronjob
  6. args="$@"
  7. echo $args
  8. # Creamos un loop para iterar los argumentos del script
  9. while [ "$1" != "" ]; do
  10.   case $1 in
  11.     -a)
  12.       # Establecemos que se ha llamado al script con la opción a
  13.       last_files=true
  14.       ;;
  15.     -e)
  16.       # Establecemos que se ha llamado al script con la opción e
  17.       last_sessions=true
  18.       ;;
  19.     -uu)
  20.       if [ -z "$2" ] || [ "$2" = *- ]; then
  21.         echo "No se puede utilizar la opción -uu sin un nombre de usuario. Utiliza la opción -h para ver la ayuda."
  22.         exit
  23.       fi
  24.       if [[ "$2" != -* ]]; then
  25.         # Establecemos que se ha llamado al script con la opción uu
  26.         user="$2"
  27.     shift
  28.       fi
  29.       ;;
  30.     -t)
  31.       # Establecemos que se ha llamado al script con la opción t
  32.       cronjob_time=$2
  33.       : ${cronjob_time:=60}
  34.       if [[ $cronjob_time = -* ]]; then
  35.         cronjob_time=60
  36.       else
  37.         shift
  38.       fi
  39.       ;;
  40.     -h)
  41.       echo "# OPCIONES DE USO #
  42.      -a           muestra listado de los archivos/directorio que cada usuario ha modificado en las últimas 24 horas.
  43.      -e           muestra información sobre el número de conexiones y el tiempo total de conexión acumulado por cada usuario durante la última semana.
  44.      -uu usuario  informa únicamente sobre el usuario indicado.
  45.      -t mm        programa la ejecución mm minutos. Se puede ejecutar con mm=0 para eliminar la programación." | sed -e 's/^[ \t]*//'
  46.       exit
  47.       ;;
  48.       *)
  49.       echo "Opción no contemplada, utiliza -h para ver el uso del script."
  50.       break
  51.       ;;
  52.   esac
  53.   shift
  54. done
  55.  
  56. # No permitimos utilizar el script sin las opciones -a o -e
  57. if [ -z "$last_files" ] && [ -z "$last_sessions" ] && [ -z "$cronjob_time" ]; then
  58.   echo "No se puede utilizar el script sin las opciones -a o -e. Utiliza -h para ver la ayuda."
  59. fi
  60.  
  61. # Función para obtener el listado de usuarios "reales" del sistema
  62. function users_function {
  63.   UID_MIN=$(cat /etc/login.defs | grep -w UID_MIN | sed 's/\s\+/,/g' | cut -d "," -f 2)
  64.   UID_MAX=$(cat /etc/login.defs | grep -w UID_MAX | sed 's/\s\+/,/g' | cut -d "," -f 2)
  65.   users=$(cat /etc/passwd | awk -F: -v min="$UID_MIN" -v max="$UID_MAX" '($3 >= min && $3 <= max) {print $1}')
  66. }
  67.  
  68. # Función para obtener la estadística de conexiones del usuario
  69. function last_sessions_function {
  70.  
  71.   last $1 --time-format short --since `date --date="7 day ago" +%Y-%m-%d` | head -n 1 -n -2 > /tmp/${1}.sessions
  72.  
  73.   minutes=0
  74.   hours=0
  75.   sessions=0
  76.  
  77.   while read file; do
  78.     columns=$(echo $file | awk '{print $10}' | sed 's/[()]//g' | awk -F'[+:]' "{ print NF }")
  79.     case $columns in
  80.       1) # El parámetro no es un tiempo válido
  81.          ;;
  82.       2) # El parámetro contiene horas y minutos
  83.          session_time=$(echo $file | awk '{print $10}' | sed 's/[()]//g')
  84.          session_minutes=$(echo "$session_time" | awk -F'[+:]' '{ print $2 }')
  85.          session_hours=$(echo "$session_time" | awk -F'[+:]' '{ print $1 }')
  86.          ;;
  87.       3) # El parámetro contiene días, horas y minutos
  88.          session_time=$(echo $file | awk '{print $10}' | sed 's/[()]//g')
  89.          session_minutes=$(echo "$session_time" | awk -F'[+:]' '{ print $3 }')
  90.          session_hours=$(echo "$session_time" | awk -F'[+:]' '{ print $2 }')
  91.          session_days=$(echo "$session_time" | awk -F'[+:]' '{ print $1 }')
  92.          session_hours=$((10#$session_hours+($session_days*24)))
  93.          ;;
  94.     esac
  95.     session_minutes=$((10#$session_minutes))
  96.     session_hours=$((10#$session_hours))
  97.     ((minutes=${minutes}+${session_minutes}))
  98.     ((hours=${hours}+${session_hours}))
  99.     ((sessions++))
  100.   done </tmp/${1}.sessions
  101.  
  102.   ((seconds_from_minutes=${minutes}*60))
  103.   ((seconds_from_hours=${hours}*3600))
  104.   ((seconds=${seconds_from_hours}+${seconds_from_minutes}))
  105.   ((d=${seconds}/86400))
  106.   ((h=(${seconds}%86400)/3600))
  107.   ((m=(${seconds}%3600)/60))
  108.   ((s=${seconds}%60))
  109.  
  110.   echo "El usuario $1 ha estado logado $sessions veces con un total de $d días, $h horas, $m minutos y $s segundos." | tee -a /root/informes/${1}-`date +%Y%m%d-%H:%M`
  111. }
  112.  
  113. # Controlamos cómo debe ejecutarse la función para obtener el tiempo de sesión
  114. if [ $last_sessions ]; then
  115.   if [ $user ]; then
  116.     last_sessions_function $user
  117.   else
  118.     users_function  
  119.     for user in $users
  120.     do
  121.     last_sessions_function $user
  122.     done
  123.   fi
  124. fi
  125.  
  126. # Función para listar los archivos y directorios modificados en los últimos 7 días  
  127. function last_files_function {
  128.   echo "## LISTADO DE FICHEROS Y DIRECTORIOS MODIFICADOS POR $1 EN LAS ÚLTIMAS 24H ##" | tee -a /root/informes/${1}-`date +%Y%m%d-%H:%M`
  129.   find /home/${1} -mtime -1 -ls | awk -v user="$1" '($5 = user) {print $8,$9,$10,$11}' | tee -a /root/informes/${1}-`date +%Y%m%d-%H:%M`
  130.   echo "## FIN DEL LISTADO ##" | tee -a date /root/informes/${1}-`date +%Y%m%d-%H:%M`
  131. }
  132.  
  133. # Controlamos cómo debe ejecutarse la función para obtener el listado de archivos y directorios
  134. if [ $last_files ]; then
  135.   if [ $user ]; then
  136.     last_files_function $user
  137.   else
  138.     users_function  
  139.     for user in $users
  140.     do
  141.     last_files_function $user
  142.     done
  143.   fi
  144. fi
  145.  
  146. # Función paa editar cron  
  147. function edit_crontab_function {
  148.   if [[ "$1" -eq "00" ]]; then
  149.     # Eliminamos del crontab de root las líneas que contengan el script
  150.     crontab -u root -l | grep -v pec2.sh | crontab -u root -
  151.   else
  152.     # Eliminamos del crontab de root las líneas que contengan el script
  153.     crontab -u root -l | grep -v pec2.sh | crontab -u root -
  154.     # Añadimos la línea con la nueva ejecución
  155.     (crontab -u root -l; echo "*/${1} * * * * root 'cd /root/scripts/ && ./pec2.sh ${args}'") | crontab -u root -
  156.   fi
  157. }
  158.  
  159. # Controlamos cómo debe ejecutarse la función para edita cron
  160. if [ $cronjob_time ]; then
  161.   edit_crontab_function $cronjob_time
  162. fi
Advertisement
Add Comment
Please, Sign In to add comment