Запустить скрипт оболочки по команде

Запустить скрипт оболочки по команде

Я хочу запустить скрипт оболочки при date -s <string>использовании команды. Например, я хочу записать команду в файл /tmp/user.log, выполнив следующую команду в скрипте оболочки

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

Как запустить скрипт оболочки, если date -s <string>он выполняется в оболочке?

Если говорить более обобщенно, я хочу запустить свой скрипт оболочки, когда кто-то другой выполнит определенную команду linux в моей системе. Как это сделать?

решение1

Перефразируя вопрос, вы хотите знать, когда кто-то пытается установить системное время. Именно для этого и auditнужна подсистема... она позволяет вам проводить аудит выполнения определенных системных вызовов. В этом случае вы хотите знать, когда кто-то вызывает любой из различных системных вызовов, которые могут изменить системное время. Используя подсистему audit, вы получаете решение, которое работает независимо от того, вызывает ли кто-то собственную /bin/dateили собственную локально созданную версию команды.

См. auditd(8)и audit.rules(7)для полного описания синтаксиса правил, а для примеров аудита операций изменения времени вы можете поискать "time-change" в nispom.rulesфайле примера. Вы можете найти это в вашей локальной системе, или вы можете найти это здесь:

Более подробную информацию о auditподсистеме (документацию найти немного сложно):

решение2

Невозможно легко запретить пользователю запускать его собственную версию программы, но если предположить, что пользователь не злонамерен, то это легко:

  1. Создайте скрипт-оболочку, который регистрирует программу, а затем запускает ее (используя исходные параметры)
  2. Убедитесь, что оболочка заменяет исходную программу в пользовательском пути.

Вы можете либо использовать псевдоним, чтобы пользователи использовали оболочку, либо просто переместить/переименовать исходную программу и поместить оболочку в исходное местоположение.

Если вы хотите регистрировать только некоторые выполнения, используйте регулярное выражение в скрипте-оболочке.

решение3

Огромное спасибо, serverfaultдрузья, за ответы.

Я думаю, что я нашел ответ на свой вопрос с вашей помощью. Но вы все любезны помочь мне, если есть какая-то ошибка, связанная с этим, или какие-то улучшения, которые нужно сделать? Вот я.

Вот что я сделал.

i). создал скрипт datewrapper.shв /etc со следующим кодом

#! /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 ; псевдоним date='/etc/datewrapper.sh'

iii) дата

Вт Дек 21 21:51:01 UTC 2010

iv). дата -s "21:53:05"

Вт Дек 21 21:53:05 UTC 2010

v). Я проверил /tmp/log/user.log. Он показывает сообщение

21 дек 21:53:05 localhost root: установлена ​​новая дата

В результате всякий раз, когда пользователь дает dateкоманду, мой скрипт будет выполнен, а всякий раз, когда он дает команду с -sопцией, она будет зарегистрирована./tmp/log/user.log

Связанный контент