क्या मैं सर्वर पर सभी उपयोगकर्ताओं के लिए बैश इतिहास खोज सकता हूँ?


20

मैं सभी 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 हां, मेरे पास पहले से ही मेरा भरण-पोषण है कि शेल इतिहास के साथ संपादित करना / संशोधित करना और अन्यथा मैकल करना कितना आसान है। = |
वेस्ले

यह एक पुराना प्रश्न है, लेकिन यह मेरा पहला Google परिणाम था, इसलिए शायद इसमें जोड़ने लायक है। मैंने इसे जांचने के लिए संशोधित किया कि फ़ाइल को 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"
टटोलने की

1
@BryKKan गैर-मौजूद फ़ाइलों को अनदेखा करना एक अच्छा विचार है। खबरदार कि जिस तरह से आप इसे कर रहे हैं वह खराब है: इसे देखते हुए व्यवहार में काम करना चाहिए कि विशिष्ट उपयोगकर्ता नाम में "अजीब" वर्ण नहीं हैं, लेकिन सामान्य रूप से {}इस तरह का उपयोग करना बहुत खतरनाक है। फ़ाइल का नाम स्क्रिप्ट में सीधे इंटरपोल किया गया है। यदि आपके पास एक फ़ाइल का नाम (यहां: एक उपयोगकर्ता नाम) है, तो कहें, $(rm -rf /)या ;rm -rf /;, कमांड निष्पादित किया जाएगा। शेल स्क्रिप्ट्स के लिए फाइल नाम हमेशा पास करें, कभी भी ढूँढें या xargs के {}तंत्र का उपयोग न करें ।
गिल्स एसओ- बुराई को रोकें '

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"

लेकिन मैं वास्तव में ऐसा नहीं सोचता कि आप क्या सोच रहे थे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.