
コマンドが使用されるときにシェルスクリプトを実行したい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)
参照してください。また、時間変更操作の監査の例については、サンプルファイルで「time-change」を検索してください。これはローカル システムで見つかるか、次の場所にあります。audit.rules(7)
nispom.rules
サブシステムに関する詳細情報audit
(ドキュメントは入手が少し難しい) については、以下を参照してください。
答え2
ユーザーが独自のバージョンのプログラムを実行するのを簡単に防ぐことはできませんが、ユーザーが悪意を持っていないと仮定すれば簡単です。
- プログラムをログに記録して実行するラッパー スクリプトを作成します (元のパラメータを使用)
- ラッパーがユーザー パス内の元のプログラムを置き換えることを確認します。
エイリアスを使用してユーザーにラッパーを使用させるか、元のプログラムを移動/名前変更してラッパーを元の場所に配置することができます。
一部の実行のみをログに記録する場合は、ラッパー スクリプトで正規表現を使用します。
答え3
答えてくれた友人たちに本当に感謝していますserverfault
。
皆さんの助けのおかげで、私の質問に対する答えが見つかったと思います。しかし、それに関連する間違いや改善すべき点があれば、皆さん親切に助けていただけませんか? さあ、始めましょう。
これらは私がやったことです。
datewrapper.sh
i). /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 ; alias date='/etc/datewrapper.sh'
iii). 日付
2010 年 12 月 21 日火曜日 21:51:01 UTC
iv). 日付 -s "21:53:05"
2010 年 12 月 21 日火曜日 21:53:05 UTC
v) /tmp/log/user.logを確認しました。次のメッセージが表示されています。
12月21日 21:53:05 localhost root: 新しい日付が設定されました
その結果、ユーザーがdate
コマンドを発行するたびにスクリプトが実行され、-s
オプション付きのコマンドを発行するたびにログインされます。/tmp/log/user.log