Bir sunucudaki tüm kullanıcılar arasında bash geçmişinde arama yapabilir miyim?


20

Birden çok kullanıcı hesabında bir Linux sunucusunda çalıştırılan tüm bash komutlarını görmek istiyorum. Kullandığım spesifik dağıtım CentOS 5.7. Bir sunucudaki .bash_history dosyalarını global olarak aramanın bir yolu var mıdır yoksa daha ev yapımı bir süreç locate | cat | grepmi olur? (Sadece yazarak titreyim).

Yanıtlar:


25

getentAna dizinleri numaralandırmak için kullanın .

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

Ev dizinleriniz iyi bilinen bir konumdaysa, bu kadar basit olabilir

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

Elbette, bir kullanıcı farklı bir kabuk veya farklı bir değer kullanıyorsa HISTFILE, bu size fazla bir şey söylemez. Bu, size bir kabuk aracılığıyla yürütülmeyen komutlar veya kullanıcının başında bazı kullanıcı dizininde bulunan takma adlar ve işlevler ve kaldırılan harici komutlar hakkında da bilgi vermez $PATH. Bilmek istediğiniz, kullanıcıların hangi komutları çalıştırdığı ise, süreç muhasebesine veya bazı meraklı denetim sistemine ihtiyacınız vardır; bkz . Bilgisayarımdaki etkinliği izleme. , Bir işlem bittikten sonra ne kadar sürdüğünü nasıl kontrol edebilirim? .


Bunun yerine süreç muhasebesini önermek için +1. Geçmiş dosyaları gerçekten kullanıcı rahatlığı içindir ve bunları herhangi bir günlük kaydı için yeterince sade hale getirmenin basit bir yolu yoktur.
jw013 15:12

@ jw013 Evet, düzenlemenin / değiştirmenin ne kadar kolay olduğunu ve kabuk geçmişiyle muck yapmayı çoktan doldurdum. = |
Wesley

Bu eski bir soru, ama ilk google sonucumdu, bu yüzden belki de eklemeye değer. Bu dosyayı grep denemeden önce var olduğunu kontrol etmek için değiştirdim: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 Varolmayan dosyaları görmezden gelmek iyi bir fikirdir. Yaptığınız yolun tehlikeli olduğunu unutmayın: tipik kullanıcı adlarının “garip” karakterler içermemesi nedeniyle pratikte çalışması gerekir, ancak genel olarak {}böyle kullanmak çok tehlikelidir. Dosya adı doğrudan komut dosyasında enterpole edilir. Diyelim ki, $(rm -rf /)ya ;rm -rf /;da komutu içeren bir dosya adınız (burada: bir kullanıcı adı) varsa, yürütülür. Dosya adlarını her zaman kabuk komut dosyalarına argüman olarak iletin, asla find veya xargs {}mekanizmasını kullanmayın.
Gilles 'SO- kötü olmayı bırak

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

Alternatif:

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

Bunun varsayılan konumlardaki ana dizinleri kapsadığını unutmayın. Ayrıştırmak /etc/passwdveya çağırmak getentve çıktısını ayrıştırmak daha iyi olur .

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

3

Yapabilirsin

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

Ama düşündüğünüzden çok daha iyi olduğunu düşünmüyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.