ฉันสามารถค้นหาทุบตีประวัติผู้ใช้ทั้งหมดบนเซิร์ฟเวอร์ได้หรือไม่?


20

ฉันต้องการเห็นคำสั่ง bash ทั้งหมดที่รันบนเซิร์ฟเวอร์ Linux ในหลายบัญชีผู้ใช้ การกระจายเฉพาะที่ฉันใช้คือ 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 ใช่ฉันมีวิธีการแก้ไข / แก้ไขที่ง่ายดายอยู่แล้ว = |
Wesley

นี่เป็นคำถามเก่า แต่มันก็เป็นผล 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 /;คำสั่งจะถูกดำเนินการ ส่งชื่อไฟล์เป็นอาร์กิวเมนต์ไปยังเชลล์สคริปต์เสมออย่าใช้{}กลไก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"

แต่ฉันไม่คิดว่ามันดีกว่าที่คุณคิด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.