Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- # Creamos la carpeta para los informes
- mkdir -p /root/informes
- # Guardamos las variables para utilizarlas en el cronjob
- args="$@"
- echo $args
- # Creamos un loop para iterar los argumentos del script
- while [ "$1" != "" ]; do
- case $1 in
- -a)
- # Establecemos que se ha llamado al script con la opción a
- last_files=true
- ;;
- -e)
- # Establecemos que se ha llamado al script con la opción e
- last_sessions=true
- ;;
- -uu)
- if [ -z "$2" ] || [ "$2" = *- ]; then
- echo "No se puede utilizar la opción -uu sin un nombre de usuario. Utiliza la opción -h para ver la ayuda."
- exit
- fi
- if [[ "$2" != -* ]]; then
- # Establecemos que se ha llamado al script con la opción uu
- user="$2"
- shift
- fi
- ;;
- -t)
- # Establecemos que se ha llamado al script con la opción t
- cronjob_time=$2
- : ${cronjob_time:=60}
- if [[ $cronjob_time = -* ]]; then
- cronjob_time=60
- else
- shift
- fi
- ;;
- -h)
- echo "# OPCIONES DE USO #
- -a muestra listado de los archivos/directorio que cada usuario ha modificado en las últimas 24 horas.
- -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.
- -uu usuario informa únicamente sobre el usuario indicado.
- -t mm programa la ejecución mm minutos. Se puede ejecutar con mm=0 para eliminar la programación." | sed -e 's/^[ \t]*//'
- exit
- ;;
- *)
- echo "Opción no contemplada, utiliza -h para ver el uso del script."
- break
- ;;
- esac
- shift
- done
- # No permitimos utilizar el script sin las opciones -a o -e
- if [ -z "$last_files" ] && [ -z "$last_sessions" ] && [ -z "$cronjob_time" ]; then
- echo "No se puede utilizar el script sin las opciones -a o -e. Utiliza -h para ver la ayuda."
- fi
- # Función para obtener el listado de usuarios "reales" del sistema
- function users_function {
- UID_MIN=$(cat /etc/login.defs | grep -w UID_MIN | sed 's/\s\+/,/g' | cut -d "," -f 2)
- UID_MAX=$(cat /etc/login.defs | grep -w UID_MAX | sed 's/\s\+/,/g' | cut -d "," -f 2)
- users=$(cat /etc/passwd | awk -F: -v min="$UID_MIN" -v max="$UID_MAX" '($3 >= min && $3 <= max) {print $1}')
- }
- # Función para obtener la estadística de conexiones del usuario
- function last_sessions_function {
- last $1 --time-format short --since `date --date="7 day ago" +%Y-%m-%d` | head -n 1 -n -2 > /tmp/${1}.sessions
- minutes=0
- hours=0
- sessions=0
- while read file; do
- columns=$(echo $file | awk '{print $10}' | sed 's/[()]//g' | awk -F'[+:]' "{ print NF }")
- case $columns in
- 1) # El parámetro no es un tiempo válido
- ;;
- 2) # El parámetro contiene horas y minutos
- session_time=$(echo $file | awk '{print $10}' | sed 's/[()]//g')
- session_minutes=$(echo "$session_time" | awk -F'[+:]' '{ print $2 }')
- session_hours=$(echo "$session_time" | awk -F'[+:]' '{ print $1 }')
- ;;
- 3) # El parámetro contiene días, horas y minutos
- session_time=$(echo $file | awk '{print $10}' | sed 's/[()]//g')
- session_minutes=$(echo "$session_time" | awk -F'[+:]' '{ print $3 }')
- session_hours=$(echo "$session_time" | awk -F'[+:]' '{ print $2 }')
- session_days=$(echo "$session_time" | awk -F'[+:]' '{ print $1 }')
- session_hours=$((10#$session_hours+($session_days*24)))
- ;;
- esac
- session_minutes=$((10#$session_minutes))
- session_hours=$((10#$session_hours))
- ((minutes=${minutes}+${session_minutes}))
- ((hours=${hours}+${session_hours}))
- ((sessions++))
- done </tmp/${1}.sessions
- ((seconds_from_minutes=${minutes}*60))
- ((seconds_from_hours=${hours}*3600))
- ((seconds=${seconds_from_hours}+${seconds_from_minutes}))
- ((d=${seconds}/86400))
- ((h=(${seconds}%86400)/3600))
- ((m=(${seconds}%3600)/60))
- ((s=${seconds}%60))
- 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`
- }
- # Controlamos cómo debe ejecutarse la función para obtener el tiempo de sesión
- if [ $last_sessions ]; then
- if [ $user ]; then
- last_sessions_function $user
- else
- users_function
- for user in $users
- do
- last_sessions_function $user
- done
- fi
- fi
- # Función para listar los archivos y directorios modificados en los últimos 7 días
- function last_files_function {
- echo "## LISTADO DE FICHEROS Y DIRECTORIOS MODIFICADOS POR $1 EN LAS ÚLTIMAS 24H ##" | tee -a /root/informes/${1}-`date +%Y%m%d-%H:%M`
- 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`
- echo "## FIN DEL LISTADO ##" | tee -a date /root/informes/${1}-`date +%Y%m%d-%H:%M`
- }
- # Controlamos cómo debe ejecutarse la función para obtener el listado de archivos y directorios
- if [ $last_files ]; then
- if [ $user ]; then
- last_files_function $user
- else
- users_function
- for user in $users
- do
- last_files_function $user
- done
- fi
- fi
- # Función paa editar cron
- function edit_crontab_function {
- if [[ "$1" -eq "00" ]]; then
- # Eliminamos del crontab de root las líneas que contengan el script
- crontab -u root -l | grep -v pec2.sh | crontab -u root -
- else
- # Eliminamos del crontab de root las líneas que contengan el script
- crontab -u root -l | grep -v pec2.sh | crontab -u root -
- # Añadimos la línea con la nueva ejecución
- (crontab -u root -l; echo "*/${1} * * * * root 'cd /root/scripts/ && ./pec2.sh ${args}'") | crontab -u root -
- fi
- }
- # Controlamos cómo debe ejecutarse la función para edita cron
- if [ $cronjob_time ]; then
- edit_crontab_function $cronjob_time
- fi
Advertisement
Add Comment
Please, Sign In to add comment