
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 audit
serve 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 audit
subsistema, você tem uma solução que funciona independentemente de alguém estar ligando /bin/date
ou 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.rules
arquivo de exemplo. Você pode encontrar isso em seu sistema local ou aqui:
Para obter mais informações sobre o audit
subsistema (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:
- Crie um script wrapper que registre o programa e o execute (usando os parâmetros originais)
- 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 serverfault
amigos, 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.sh
em /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 date
o comando, meu script será executado e sempre que ele emitir o comando com -s
opção, ele será logado/tmp/log/user.log