Ejecutar script de shell en un comando

Ejecutar script de shell en un comando

Quiero ejecutar un script de shell cuando date -s <string>se usa el comando. Por ejemplo, quiero registrar el comando en el archivo /tmp/user.log ejecutando el siguiente comando en el script de shell

logger -p user.notice "date -s command executed" -f /tmp/user.log

¿Cómo se puede ejecutar un script de Shell cuando date -s <string>se ejecuta en el Shell?

Para hacerlo más general, quiero ejecutar mi script de shell cuando alguien más emite un comando de Linux en particular en mi sistema. ¿Como hacer esto?

Respuesta1

Para reformular la pregunta, desea saber cuándo alguien intenta configurar la hora del sistema. Esto es exactamente para lo que auditsirve el subsistema... le permite auditar la ejecución de llamadas específicas al sistema. En este caso, desea saber cuándo alguien realiza alguna de las diversas llamadas al sistema que pueden cambiar la hora del sistema. Al utilizar el auditsubsistema, tiene una solución que funciona independientemente de si alguien está llamando /bin/dateo de su propia versión del comando creada localmente.

Consulte auditd(8)y audit.rules(7)para obtener una descripción completa de la sintaxis de las reglas y para ver ejemplos de operaciones de cambio de hora de auditoría, puede buscar "cambio de hora" en el nispom.rulesarchivo de ejemplo. Puede encontrarlo en su sistema local o puede encontrarlo aquí:

Para obtener más información sobre el auditsubsistema (y la documentación es un poco difícil de conseguir):

Respuesta2

No se puede evitar fácilmente que un usuario ejecute su propia versión del programa, pero si se supone que el usuario no es malintencionado, es fácil:

  1. Cree un script contenedor que registre el programa y luego lo ejecute (usando los parámetros originales)
  2. Asegúrese de que el contenedor reemplace el programa original en la ruta del usuario.

Puede usar un alias para que los usuarios usen el contenedor, o simplemente puede mover/cambiar el nombre del programa original y colocar el contenedor en la ubicación original.

Si solo desea registrar algunas de las ejecuciones, utilice una expresión regular en el script contenedor.

Respuesta3

Muchas gracias serverfaultamigos míos por las respuestas.

Creo que he encontrado una respuesta a mi pregunta con toda su ayuda. Pero, ¿podrían ayudarme si hay algún error asociado o si hay alguna mejora por hacer? Aquí voy.

Estas son las cosas que hice.

i). Creó un script, datewrapper.shen /etc con el siguiente código

#! /bin/bash

# wrapper script for the date command.
# whenever the date -s command is issued, it will be logged.

# executing the date command first with parameter list if any
date $@

# check whether the date command executed successfully
if [ "$?" == "0" ] ; then
   for param in $@ ; do
      # if "-s" option is used, log it
      if [ "$param" == "-s" ] ; then
         # user.notice logs the message to /tmp/log/user.log
         # as per the commands in /etc/syslog-ng/syslog-ng.conf
         logger -p user.notice "New date set"
         break
      fi
   done
fi

exit 0

ii). chmod a+x /etc/datewrapper.sh; alias fecha='/etc/datewrapper.sh'

iii). fecha

martes 21 de diciembre 21:51:01 UTC 2010

iv). fecha -s "21:53:05"

martes 21 de diciembre 21:53:05 UTC 2010

v). Revisé /tmp/log/user.log. Muestra el mensaje

21 de diciembre 21:53:05 raíz de localhost: nueva fecha establecida

Entonces, el resultado es que cada vez que el usuario da dateun comando, mi script se ejecutará y cada vez que emita el comando con -sla opción, iniciará sesión en/tmp/log/user.log

información relacionada