我可以在服务器上的所有用户中搜索bash历史记录吗?


20

我想查看在Linux服务器上跨多个用户帐户运行的所有bash命令。我使用的特定发行版是CentOS 5.7。有没有一种方法可以全局搜索服务器上的.bash_history文件,或者这是一个更加本土化的过程locate | cat | grep?(我只是打了一下就颤抖了)。

Answers:


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

当然,如果用户使用其他shell或的其他值HISTFILE,这不会告诉您太多。这也不会告诉您没有通过shell执行的命令,也不会告诉您别名和函数以及现在在用户目录中某个用户目录中已删除的外部命令$PATH。如果您想知道用户运行了哪些命令,则需要过程记帐或更高级的审核系统;请参阅监视计算机上的活动。如何检查一个过程完成了多长时间?


+1用于建议流程记帐。历史记录文件确实是为了方便用户使用,没有简单的方法可以使它们足够安全以实现任何日志记录目的。
jw013 '02

@ jw013是的,我已经了解了编辑/修改的简易性,否则就不了解shell历史记录了。= |
韦斯利

这是一个老问题,但这是我的第一个Google搜索结果,所以也许值得补充。我修改了它,以在尝试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 /;,则将执行该命令。始终将文件名作为参数传递给Shell脚本,永远不要使用find或xargs的{}机制。
吉尔(Gilles)'所以

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"

但是我真的不认为这比您想的要好得多。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.