サーバー上のすべてのユーザーでbash履歴を検索できますか?


20

Linuxサーバーで複数のユーザーアカウントで実行されたすべてのbashコマンドを確認したい。私が使用している特定のディストリビューションはCentOS 5.7です。サーバー上の.bash_historyファイルをグローバルに検索する方法はありますか、それともより自家製のプロセスlocate | cat | grepですか?(私はただそれを打ち込んで震えています)。

回答:


25

getentホームディレクトリを列挙するために使用します。

getent passwd |
cut -d : -f 6 |
sed 's:$:/.bash_history:' |
xargs -d '\n' grep -s -H -e "$pattern" 

ホームディレクトリが既知の場所にある場合、次のように簡単になります。

grep -e "$pattern" /home/*/.bash_history

もちろん、ユーザーが別のシェルまたは別の値を使用している場合HISTFILE、これはあまりわかりません。また、シェルを介して実行されなかったコマンドや、ユーザーのの初期のユーザーディレクトリにあったエイリアスと関数、および現在削除されている外部コマンドについても説明しません$PATH。知りたいことがユーザーが実行したコマンドである場合、プロセスアカウンティングまたはより洗練された監査システムが必要です。コンピューターでのアクティビティの監視を参照してくださいプロセスが終了してから実行された時間を確認するにどうすればよいですか?


代わりに、プロセスアカウンティングを提案するための+1。履歴ファイルは本当にユーザーの利便性のためのものであり、あらゆる種類のログ記録の目的に十分に簡単に対応できる簡単な方法はありません。
jw013

@ jw013はい、すでにシェルの履歴を編集/変更し、それ以外の方法でマックするのがどれほど簡単かを十分に説明しました。= |
ウェズリー

これは古い質問ですが、それは私の最初のグーグルの結果だったので、追加する価値があるかもしれません。これを修正して、grepを試みる前にファイルが存在することを確認しましたgetent passwd | cut -d : -f 6 | sed "s:$:/.bash_history:" | xargs -d'\n' -I{} sh -c "[ -f {} ] && echo {}" | xargs -d'\n' grep -Hn -e "$pattern"
。– BryKKan

1
@BryKKan存在しないファイルを無視することをお勧めします。あなたがそれをしている方法は危険であることに注意してください:典型的なユーザー名に「奇妙な」文字が含まれていないことを考えると、実際に動作するはずですが、一般的に{}このような使用は非常に危険です。ファイル名は、スクリプト内で直接補間されます。たとえば、$(rm -rf /)またはを含むファイル名(ここではユーザー名)がある場合;rm -rf /;、コマンドが実行されます。シェルスクリプトへの引数として常にファイル名を渡し、findまたはxargsの{}メカニズムを使用しないでください。
ジル 'SO-悪であるのをやめる'

4
find /home -name .bash_history | xargs grep <string>

代わりに:

grep string $(find /home -name .bash_history)

これは、デフォルトの場所のホームディレクトリを対象とすることに注意してください。を解析/etc/passwdまたは起動しgetent、その出力を解析することをお勧めします。

for i in $(getent passwd | cut -d: -f6 ); do grep string ${i}/.bash_history; done

3

できる

find /home | grep bash_history | xargs grep "whatever"

しかし、私はあなたが考えていたよりもずっと良いとは本当に思いません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.