Я хочу запустить скрипт оболочки при 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
Невозможно легко запретить пользователю запускать его собственную версию программы, но если предположить, что пользователь не злонамерен, то это легко:
- Создайте скрипт-оболочку, который регистрирует программу, а затем запускает ее (используя исходные параметры)
- Убедитесь, что оболочка заменяет исходную программу в пользовательском пути.
Вы можете либо использовать псевдоним, чтобы пользователи использовали оболочку, либо просто переместить/переименовать исходную программу и поместить оболочку в исходное местоположение.
Если вы хотите регистрировать только некоторые выполнения, используйте регулярное выражение в скрипте-оболочке.
решение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