ค้นหากระบวนการที่กำลังเปลี่ยนแปลงไฟล์


35

ฉันกำลังพยายามหาวิธีที่เชื่อถือได้ในการค้นหากระบวนการบนเครื่องของฉันที่กำลังเปลี่ยนไฟล์กำหนดค่า ( /etc/hostsเป็นเฉพาะ)

ฉันรู้ว่าฉันสามารถใช้lsof /etc/hostsเพื่อค้นหาว่ากระบวนการใดที่เปิดไฟล์อยู่ในขณะนี้ แต่ก็ไม่ได้ช่วยอะไรเพราะกระบวนการเปิดไฟล์อย่างเห็นได้ชัดเขียนไปแล้วปิดอีกครั้ง

ฉันยังดูที่lsofตัวเลือกการทำซ้ำ (-r) แต่ดูเหมือนว่าจะเร็วเพียงหนึ่งวินาทีซึ่งอาจไม่เคยบันทึกการเขียนที่กำลังดำเนินอยู่

ฉันรู้ว่ามีเครื่องมือสองสามตัวสำหรับการตรวจสอบการเปลี่ยนแปลงของระบบไฟล์ แต่ในกรณีนี้ฉันต้องการทราบว่ากระบวนการใดรับผิดชอบซึ่งหมายถึงการจับมันในการกระทำ

คำตอบ:


52

คุณสามารถใช้การตรวจสอบเพื่อค้นหาสิ่งนี้ หากยังไม่พร้อมใช้งานให้ติดตั้งและเปิดใช้งานการตรวจสอบสำหรับ distro ของคุณ

ตั้งค่าการตรวจสอบการตรวจสอบใน / etc / hosts

/sbin/auditctl -w /etc/hosts -p war -k hosts-file

-w watch /etc/hosts
-p warx watch for write, attribute change, execute or read events
-k hosts-file is a search key.

รอจนกว่าไฟล์โฮสต์จะเปลี่ยนจากนั้นใช้ ausearch เพื่อตรวจสอบสิ่งที่บันทึกไว้

/sbin/ausearch -f /etc/hosts | more

คุณจะได้รับผลลัพธ์จำนวนมากเช่น


เวลา -> พุธ 12 ตุลาคม 09:34:07 ประเภท 2011 = เส้นทาง msg = การตรวจสอบ (1318408447.180: 870): รายการ = 0 ชื่อ = "/ etc / โฮสต์" inode = 2211062 dev = fd: 00 โหมด = 0100644 ouid = 0 ogid = 0 rdev = 00: 00 obj = system_u: object_r: etc_t: s0 ประเภท = CWD msg = การตรวจสอบ (1318408447.180: 870): cwd = "/ home / iain" ประเภท = SYSCALL msg = การตรวจสอบ (1318408447.180: 870) c000003e syscall = 2 สำเร็จ = ใช่ exit = 0 a0 = 7fff73641c4f a1 = 941 a2 = 1b6 a3 = 3e7075310c รายการ = 1 ppid = 7259 pid = 7294 aid id = 1001 uid = 0 gid = 0 eid egid = 0 sgid = 0 fsgid = 0 tty = pts0 ses = 123 comm = "touch" exe = "/ bin / touch" subj = user_u: system_r: unconfined_t: s0 key = "โฮสต์ไฟล์"


ในกรณีนี้ฉันใช้คำสั่ง touch เพื่อเปลี่ยนไฟล์ timstamp มัน pid คือ 7294 และ ppid คือ 7259 (เปลือกของฉัน)


2
"เปิดใช้งานการตรวจสอบสำหรับ distro ของคุณ" น่าจะขยายได้เล็กน้อย น่ารำคาญคำสั่งข้างต้นทำให้ฉันไม่มีข้อผิดพลาดหรือผลลัพธ์ "/ sbin / auditctl -e 1" ก็ไม่ได้ช่วยเช่นกัน การรันการตรวจสอบบัญชีเพื่อทำการบันทึกช่วยได้ - "/etc/init.d/auditd start" (ถึงแม้ว่ามันจะลบกฎของฉันดังนั้นฉันจึงต้องป้อนอีกครั้ง)
tobixen

ไม่ได้ผลสำหรับฉันausearchเสมอกลับมา<no matches>
m0skit0

1
บางครั้งคุณอาจต้องตั้งค่าการตรวจสอบหลายครั้งเพื่อรับกระบวนการจริงซึ่งเริ่มต้นการแก้ไขหากกระบวนการนั้นเป็นตัวอย่างการเรียกใช้คำสั่งภายนอกเพื่อทำงานให้สำเร็จ เช่นฉันพยายามค้นหาว่าทำไมรายการ crontab ของผู้ใช้จึงถูกรีเซ็ตตลอดเวลา คำสั่ง crontab มีหน้าที่รับผิดชอบ แต่เมื่อถึงเวลาที่ฉันตรวจสอบ ppid มันได้ออกไปแล้วดังนั้นฉันจึงต้องตรวจสอบ / usr / bin / crontab เช่นกันจากนั้นตรงกับเวลาประทับของการเข้าถึง crontab กับการตรวจสอบการดำเนินการของ crontab แล้วตรวจสอบ มันเป็น ppid ... ซึ่งเผยให้เห็นว่าดีมอนการบังคับใช้การกำหนดค่า cron ผู้ใช้ที่เฉพาะเจาะจง
วิล

3

คุณยังสามารถใช้ inotify-tools:

  inotifywait -mq -e open -e modify /etc/hosts

14
Auditd สามารถให้ข้อมูลที่คุณต้องการ แม้ว่ามันจะง่ายต่อการตั้งสมมติฐานว่า inotify จะช่วยให้คุณทำเช่นนี้ - มันจะไม่เพราะมันจะไม่ให้ ID กระบวนการที่ทำให้การปรับเปลี่ยนของคุณ
คัดค้าน

2

หลังจากการค้นหาจำนวนมากฉันพบวิธีแก้ปัญหาเพียงแค่ใช้คำสั่งนี้: sudo fs_usage | grep [path_to_file]


2
สำหรับ MacOS เท่านั้น ...
majick

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