Tôi có thể tìm kiếm lịch sử bash trên tất cả người dùng trên máy chủ không?


20

Tôi muốn xem tất cả các lệnh bash đã được chạy trên máy chủ Linux trên nhiều tài khoản người dùng. Phân phối cụ thể tôi đang sử dụng là CentOS 5.7. Có cách nào để tìm kiếm trên toàn cầu file .bash_history trên máy chủ hoặc nó sẽ là một quá trình cây nhà lá vườn hơn locate | cat | grep? (Tôi rùng mình chỉ cần gõ nó ra).

Câu trả lời:


25

Sử dụng getentđể liệt kê các thư mục nhà.

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

Nếu thư mục nhà của bạn ở một vị trí nổi tiếng, nó có thể đơn giản như

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

Tất nhiên, nếu người dùng sử dụng vỏ khác hoặc giá trị khác HISTFILE, điều này sẽ không cho bạn biết nhiều. Điều này cũng sẽ không cho bạn biết về các lệnh không được thực thi thông qua trình bao, hoặc về bí danh và hàm và các lệnh bên ngoài đã bị xóa trong thư mục người dùng sớm trong người dùng $PATH. Nếu những gì bạn muốn biết là những lệnh nào người dùng đã chạy, bạn cần xử lý kế toán hoặc một số hệ thống kiểm toán fancier; xem Hoạt động giám sát trên máy tính của tôi. , Làm thế nào để kiểm tra một quá trình chạy sau bao lâu? .


+1 để đề xuất kế toán quy trình thay thế. Các tệp lịch sử thực sự là để thuận tiện cho người dùng và không có cách đơn giản nào để làm cho chúng đủ chứng minh cho mọi mục đích ghi nhật ký.
jw013

@ jw013 Có, tôi đã điền vào cách dễ dàng để chỉnh sửa / sửa đổi và nếu không thì có lịch sử shell. = |
Wesley

Đây là một câu hỏi cũ, nhưng nó là kết quả google đầu tiên của tôi, vì vậy có lẽ đáng để thêm vào. Tôi đã sửa đổi điều này để kiểm tra xem tập tin có tồn tại trước khi cố grep nó không: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 Bỏ qua các tệp không tồn tại là một ý tưởng tốt. Xin lưu ý rằng cách bạn thực hiện nó thật tinh ranh: nó sẽ hoạt động trong thực tế do các tên người dùng thông thường không chứa các ký tự lạ lạ lùng, nhưng nói chung sử dụng {}như thế này rất nguy hiểm. Tên tệp được nội suy trực tiếp trong tập lệnh. Nếu bạn có một tên tệp (ở đây: tên người dùng) có chứa, giả sử, $(rm -rf /)hoặc ;rm -rf /;, lệnh sẽ được thực thi. Luôn chuyển tên tệp dưới dạng đối số cho tập lệnh shell, không bao giờ sử dụng {}cơ chế find hoặc xargs .
Gilles 'SO- ngừng trở nên xấu xa'

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

Cách khác:

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

Lưu ý rằng điều này bao gồm các thư mục nhà ở vị trí mặc định. Nó sẽ tốt hơn để phân tích /etc/passwdhoặc gọi getent, và phân tích đầu ra của điều đó.

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

3

Bạn có thể làm

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

Nhưng tôi không thực sự nghĩ rằng điều đó tốt hơn nhiều so với những gì bạn đang nghĩ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.