私はbashを介して私が最も実行しているプログラムを数えることを望みます。 bashにある種のフックを挿入してbashが実行するすべての操作を記録する方法はありますか?
単にbash履歴ファイルを見るだけでは不十分です。履歴の各行で最初のトークンを印刷できますが、パイプとプロセスの交換は行われません。私は以下が欲しい:
$ ls /usr/bin/* | fgrep $(echo grep)
ls
、、、fgrep
および実行をそれぞれ1回記録しますecho
。そして次:
$ for file in /usr/bin/*; do stat $file; echo $file; done
注意を払って走らなければstat
なりませんecho
。 Bash フロー制御ステートメントなのでfor
記録されません。
シェルの組み込み機能と関数を記録する必要があるかどうかは議論の余地があります(おそらくその内容のみ)。上記の例では、1つ以上のランループを記録する必要があるかどうかも議論のstat
余地echo
があります。ただし、最も簡単な方法で出力を処理できます。
Bashを実行すると、プロセスに接続して進行状況を記録する-x
内部メカニズムがあることがわかります。exec
入る他の方法はありませんか?
答え1
まず、
strace -e execve -b execve -f -qqv -e signal='!all' bash
スモークテストを使用していない場合は、stderrをいくつかのロガーパイプにリダイレクトするか、straceのファイルを使用していくつかの乱れディレクトリを破棄する必要があります-o
。-o ~/commandtraces/$(date +%Y%m%d%H%M%S).$$
すべての対話型シェルに対してこれを行うには、再帰を防ぐためにガード変数が必要だと思います.bashrc
。
答え2
ローカルシステムで非常に注意を払っている場合は、すべての/ usr / binファイルをラッパーに置き換えることができます。
それはまるで
cp -pr /usr/bin /usr/orgbin
cd /usr/bin
for f in *; do
echo "/usr/orgbin/echo $f used >> /tmp/bin_usage.out" > $f
chmod +x $f
done
まず、無害なプログラム2つを試してみましょうか?
答え3
PROMPT_COMMAND
フックを使用して、最後に入力したコマンドを記録する内容を挿入できます。このログはコマンドを使用して生成できますlogger
。
それはまるでexport PROMPT_COMMAND="logger `history 1`"