Bisakah saya mencari riwayat bash di semua pengguna di server?

20

Saya ingin melihat semua perintah bash yang telah dijalankan pada server Linux di beberapa akun pengguna. Distribusi spesifik yang saya gunakan adalah CentOS 5.7. Apakah ada cara untuk mencari file .bash_history secara global di server atau apakah itu akan menjadi proses yang dibuat di rumah locate | cat | grep? (Aku ngeri hanya mengetik itu).

Wesley
sumber

Jawaban:

25

Gunakan getentuntuk menghitung direktori home.

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

Jika direktori home Anda berada di lokasi yang terkenal, itu bisa sesederhana

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

Tentu saja, jika pengguna menggunakan shell yang berbeda atau nilai yang berbeda HISTFILE, ini tidak akan memberi tahu Anda banyak. Ini juga tidak akan memberi tahu Anda tentang perintah yang tidak dieksekusi melalui shell, atau tentang alias dan fungsi dan perintah eksternal yang dihapus sekarang yang ada di beberapa direktori pengguna di awal pengguna $PATH. Jika apa yang ingin Anda ketahui adalah perintah apa yang telah dijalankan pengguna, Anda perlu proses akuntansi atau sistem audit yang lebih menarik; lihat Memantau aktivitas di komputer saya. , Bagaimana cara memeriksa berapa lama proses berjalan setelah selesai? .

Gilles 'SANGAT berhenti menjadi jahat'
sumber
+1 untuk menyarankan proses akuntansi sebagai gantinya. File histori benar-benar untuk kenyamanan pengguna dan tidak ada cara sederhana untuk membuatnya cukup bodoh untuk segala jenis tujuan logging.
jw013
@ jw013 Ya, saya sudah mengisi betapa mudahnya untuk mengedit / memodifikasi dan jika tidak, muck dengan sejarah shell. = |
Wesley
Ini adalah pertanyaan lama, tapi ini adalah hasil google pertama saya, jadi mungkin perlu ditambahkan. Saya memodifikasi ini untuk memeriksa apakah file tersebut ada sebelum mencoba untuk menerimanya: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 Mengabaikan file yang tidak ada adalah ide yang bagus. Berhati-hatilah karena cara Anda melakukannya sangat cerdik: harus bekerja dalam praktik mengingat bahwa nama pengguna biasa tidak mengandung karakter "aneh", tetapi secara umum menggunakan {}seperti ini sangat berbahaya. Nama file diinterpolasi langsung dalam skrip. Jika Anda memiliki nama file (di sini: nama pengguna) yang berisi, ucapkan, $(rm -rf /)atau ;rm -rf /;, perintah akan dieksekusi. Selalu berikan nama file sebagai argumen ke skrip shell, jangan pernah gunakan {}mekanisme find atau xargs .
Gilles 'SANGAT berhenti menjadi jahat'
4
find /home -name .bash_history | xargs grep <string>

Kalau tidak:

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

Perhatikan bahwa ini mencakup direktori home di lokasi default. Akan lebih baik untuk mem /etc/passwd- parsing atau memohon getent, dan parsing output dari itu.

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

Anda bisa melakukannya

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

Tapi saya tidak berpikir itu jauh lebih baik daripada apa yang Anda pikirkan.

brodie31k
sumber