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 audit
sirve 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 audit
subsistema, tiene una solución que funciona independientemente de si alguien está llamando /bin/date
o 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.rules
archivo de ejemplo. Puede encontrarlo en su sistema local o puede encontrarlo aquí:
Para obtener más información sobre el audit
subsistema (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:
- Cree un script contenedor que registre el programa y luego lo ejecute (usando los parámetros originales)
- 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 serverfault
amigos 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.sh
en /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 date
un comando, mi script se ejecutará y cada vez que emita el comando con -s
la opción, iniciará sesión en/tmp/log/user.log