Tìm hiểu quá trình thay đổi một tập tin


35

Tôi đang cố gắng tìm một cách đáng tin cậy để tìm quá trình trên máy của mình đang thay đổi tệp cấu hình ( /etc/hostscụ thể).

Tôi biết tôi có thể sử dụng lsof /etc/hostsđể tìm hiểu các quy trình hiện đang mở tệp, nhưng điều này không giúp ích gì vì quy trình rõ ràng là mở tệp, ghi vào tệp và sau đó đóng lại.

Tôi cũng đã xem xét lsoftùy chọn lặp lại (-r), nhưng dường như nó chỉ diễn ra nhanh như một lần trong một giây, mà có lẽ sẽ không bao giờ nắm bắt được tiến trình viết.

Tôi biết một vài công cụ để theo dõi các thay đổi đối với hệ thống tập tin, nhưng trong trường hợp này tôi muốn biết quy trình nào chịu trách nhiệm, có nghĩa là bắt nó trong hành động.

Câu trả lời:


52

Bạn có thể sử dụng kiểm toán để tìm thấy điều này. Nếu chưa có sẵn, hãy cài đặt và cho phép kiểm tra bản phân phối của bạn.

đặt đồng hồ kiểm toán trên / 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.

Đợi cho đến khi tệp máy chủ thay đổi và sau đó sử dụng ausearch để xem những gì được ghi lại

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

Bạn sẽ nhận được khối lượng đầu ra, ví dụ


thời gian-> Thứ tư ngày 12 tháng 10 09:34:07 2011 loại = PATH dir = kiểm toán (1318408447.180: 870): item = 0 name = "/ etc / hosts" inode = 2211062 dev = fd: 00 mode = 0100644 ouid = 0 ogid = 0rdev = 00: 00 obj = system_u: object_r: etc_t: s0 type = CWD dir = aud (1318408447.180: 870): cwd = "/ home / iain" type = SYSCALL dir = aud (1318408447.180: 870) c000003e syscall = 2 thành công = yes exit = 0 a0 = 7fff73641c4f a1 = 941 a2 = 1b6 a3 = 3e7075310c các mặt hàng = 1 ppid = 7259 pid = 7294 au id = 1001 uid = 0id = 0 egid = 0 sgid = 0 fsgid = 0 tty = pts0 ses = 123 comm = "touch" exe = "/ bin / touch" subj = user_u: system_r: unconfined_t: s0 key = "hosts-file"


Trong trường hợp này, tôi đã sử dụng lệnh cảm ứng để thay đổi dấu thời gian của tập tin, nó là 7294 và ppid là 7259 (vỏ của tôi).


2
"Cho phép kiểm toán cho bản phân phối của bạn" có lẽ nên được mở rộng một chút. Khó chịu, các lệnh trên cho tôi không có lỗi cũng không có kết quả. "/ Sbin / audctl -e 1" cũng không giúp được gì. Chạy một deamon kiểm toán để thực hiện ghi nhật ký đã giúp - "/etc/init.d/auditd start" (mặc dù nó đã xóa các quy tắc của tôi, vì vậy tôi phải nhập lại chúng).
tobixen

Không làm việc cho tôi, ausearchluôn trả lại<no matches>
m0skit0

1
đôi khi bạn có thể cần phải thiết lập nhiều cuộc kiểm toán để có được quy trình thực tế bắt đầu sửa đổi nếu quy trình đó là ví dụ gọi một lệnh bên ngoài để thực hiện công việc cho nó. tức là tôi đã cố gắng tìm hiểu tại sao một mục nhập crontab của người dùng liên tục được đặt lại. Lệnh crontab chịu trách nhiệm nhưng vào thời điểm tôi kiểm tra ppid nó đã thoát, vì vậy tôi cũng phải kiểm toán / usr / bin / crontab, sau đó khớp dấu thời gian của quyền truy cập vào crontab với lệnh thực thi đã kiểm toán của crontab và sau đó kiểm tra đó là ppid ... tiết lộ một trình nền phối hợp đang thực thi một cấu hình cron người dùng cụ thể.
Wil

3

Bạn cũng có thể sử dụng các công cụ inotify:

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

14
Auditd có thể cung cấp cho bạn thông tin bạn muốn. Mặc dù thật dễ dàng để đưa ra giả định rằng inotify sẽ cho phép bạn làm điều này - nó sẽ không, vì nó sẽ không cung cấp cho bạn id quá trình thực hiện sửa đổi.
khách quan

2

Sau rất nhiều lần tìm kiếm, tôi đã tìm ra giải pháp, chỉ cần sử dụng lệnh này: sudo fs_usage | grep [path_to_file]


2
cái này chỉ dành cho MacOS ...
majick

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.