Execute o script shell em um comando

Execute o script shell em um comando

Quero executar um script de shell quando date -s <string>o comando for usado. Por exemplo, quero registrar o comando no arquivo /tmp/user.log executando o seguinte comando no shell script

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

Como posso executar um script de shell quando date -s <string>é executado no shell?

Para torná-lo mais geral, quero executar meu script de shell quando alguém emitir um comando Linux específico em meu sistema. Como fazer isso?

Responder1

Reformulando a pergunta, você deseja saber quando alguém tenta definir a hora do sistema. É exatamente para isso que auditserve o subsistema... ele permite auditar a execução de chamadas de sistema específicas. Nesse caso, você deseja saber sempre que alguém faz alguma das várias chamadas do sistema que podem alterar a hora do sistema. Ao usar o auditsubsistema, você tem uma solução que funciona independentemente de alguém estar ligando /bin/dateou de sua própria versão do comando criada localmente.

Consulte auditd(8)e audit.rules(7)para obter uma descrição completa da sintaxe das regras e para obter exemplos de auditoria de operações de mudança de horário, você pode procurar por "mudança de horário" no nispom.rulesarquivo de exemplo. Você pode encontrar isso em seu sistema local ou aqui:

Para obter mais informações sobre o auditsubsistema (e a documentação é um pouco difícil de encontrar):

Responder2

Você não pode impedir facilmente que um usuário execute sua própria versão do programa, mas se você assumir que o usuário não é malicioso, é fácil:

  1. Crie um script wrapper que registre o programa e o execute (usando os parâmetros originais)
  2. Certifique-se de que o wrapper substitua o programa original no caminho do usuário.

Você pode usar um alias para fazer com que os usuários usem o wrapper ou pode simplesmente mover/renomear o programa original e colocar o wrapper no local original.

Se você deseja registrar apenas algumas das execuções, use um regexp no script wrapper.

Responder3

Muito obrigado, meus serverfaultamigos, pelas respostas.

Acho que encontrei uma resposta para minha pergunta com toda a sua ajuda. Mas todos vocês podem me ajudar se houver algum erro associado a isso ou alguma melhoria a ser feita? Aqui vou eu.

Estas são as coisas que eu fiz.

eu). criei um script, datewrapper.shem /etc com o seguinte 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 date='/etc/datewrapper.sh'

iii). data

Terça-feira, 21 de dezembro 21:51:01 UTC 2010

4). data -s "21:53:05"

Terça-feira, 21 de dezembro 21:53:05 UTC 2010

v). Eu verifiquei o /tmp/log/user.log. Mostra a mensagem

21 de dezembro 21:53:05 raiz localhost: nova data definida

Então o resultado é que sempre que o usuário der dateo comando, meu script será executado e sempre que ele emitir o comando com -sopção, ele será logado/tmp/log/user.log

informação relacionada