Liệt kê các tập tin được truy cập bởi một chương trình


64

time là một lệnh tuyệt vời nếu bạn muốn tìm ra thời gian CPU cho một lệnh đã cho.

Tôi đang tìm kiếm một cái gì đó tương tự có thể liệt kê các tập tin được truy cập bởi một chương trình và con của nó. Hoặc trong thời gian thực hoặc như một báo cáo sau đó.

Hiện tại tôi đang sử dụng:

#!/bin/bash

strace -ff -e trace=file "$@" 2>&1 | perl -ne 's/^[^"]+"(([^\\"]|\\[\\"nt])*)".*/$1/ && print'

nhưng nó không thành công nếu lệnh chạy liên quan sudo. Nó không thông minh lắm (sẽ rất tuyệt nếu nó chỉ có thể liệt kê các tệp hiện có hoặc có vấn đề về quyền hoặc nhóm chúng thành các tệp được đọc và các tệp được ghi). Cũng stracechậm, vì vậy nó sẽ tốt với sự lựa chọn nhanh hơn.


Với việc bạn sử dụng strace, tôi cho rằng bạn đặc biệt quan tâm đến Linux. Chính xác?
Gilles 'SO- ngừng trở nên xấu xa'

Linux là mối quan tâm chính của tôi.
Ole Tange

Câu trả lời:


51

Tôi đã từ bỏ và mã hóa công cụ của riêng tôi. Để trích dẫn từ các tài liệu của nó:

SYNOPSIS
    tracefile [-adefnu] command
    tracefile [-adefnu] -p pid

OPTIONS
    -a        List all files
    -d        List only dirs
    -e        List only existing files
    -f        List only files
    -n        List only non-existing files
    -p pid    Trace process id
    -u        List only files once

Nó chỉ xuất ra các tệp để bạn không cần phải xử lý đầu ra từ đó strace.

https://gitlab.com/ole.tange/tangetools/tree/master/tracefile


cảm ơn! đầu ra của strace là hoàn toàn không thể đọc được. Tôi không biết tìm tài liệu ở đâu - thật tuyệt nếu nó có tùy chọn trợ giúp -h / -. Tôi cũng đánh giá cao một tùy chọn chỉ hiển thị các chỉnh sửa tệp, không truy cập.
Xerus

@Xerus Nhân bản gitlab.com/ole.tange/tangetools và chạy make && sudo make install. Sau đó, bạn có thể chạy man tracefile.
Ole Tange

4
Công cụ đẹp. Đóng gói nó, để cài đặt: yum -y install https://extras.getpagespeed.com/release-el7-latest.rpmyum -y install tracefile
Danila Vershinin

27

Bạn có thể theo dõi các cuộc gọi hệ thống với strace, nhưng thực sự có một hình phạt tốc độ không thể tránh khỏi. Bạn cần chạy stracebằng root nếu lệnh chạy với các đặc quyền nâng cao:

sudo strace -f -o foo.trace su user -c 'mycommand'

Một phương pháp khác có khả năng nhanh hơn là tải trước một thư viện bao quanh các chức năng truy cập hệ thống tập tin : LD_PRELOAD=/path/to/libmywrapper.so mycommand. Biến LD_PRELOADmôi trường sẽ không được chuyển đến các chương trình được gọi với các đặc quyền nâng cao. Bạn sẽ phải viết mã của thư viện trình bao bọc đó ( đây là một ví dụ từ các bộ chuyển đổi thư viện của Tòa nhà xây dựng để giải trí và kiếm lợi nhuận ); Tôi không biết nếu có mã tái sử dụng có sẵn trên web.

Nếu bạn đang theo dõi các tệp trong hệ thống phân cấp thư mục cụ thể, bạn có thể tạo chế độ xem hệ thống tệp bằng LoggedFS sao cho tất cả các truy cập thông qua chế độ xem đó được ghi lại.

loggedfs -c my-loggedfs.xml /logged-view
mycommand /logged-view/somedir

Để định cấu hình LoggedFS, hãy bắt đầu với cấu hình mẫu được gửi cùng với chương trình và đọc cú pháp tệp cấu hình LoggedFS .

Một khả năng khác là hệ thống con kiểm toán của Linux . Hãy chắc chắn rằng auditddaemon được bắt đầu, sau đó cấu hình những gì bạn muốn đăng nhập auditctl. Mỗi hoạt động được ghi lại được ghi lại /var/log/audit/audit.log(trên các bản phân phối điển hình). Để bắt đầu xem một tập tin cụ thể:

auditctl -a exit,always -w /path/to/file

Nếu bạn đặt đồng hồ trên một thư mục, các tệp trong đó và các thư mục con của nó sẽ được xem theo cách đệ quy. Cẩn thận không xem thư mục chứa nhật ký kiểm toán. Bạn có thể hạn chế đăng nhập vào một số quy trình nhất định, xem auditctltrang hướng dẫn để biết các bộ lọc có sẵn. Bạn cần phải root để sử dụng hệ thống kiểm toán.


LD_PRELOADcũng sẽ không làm việc trên nhị phân tĩnh.
David đưa ra

6

Tôi nghĩ rằng bạn muốn lsof (có thể được dẫn đến một grep trên chương trình và đó là trẻ em). Nó sẽ cho bạn biết mọi tập tin hiện đang được truy cập trên hệ thống tập tin. Để biết thông tin về các tệp được truy cập theo quy trình ( từ đây ):

lsof -n -p `pidof your_app`

11
Nhưng nó chỉ cho tôi một ảnh chụp nhanh. Những gì tôi cần là những gì nó đã cố gắng truy cập. Hãy nghĩ về tình huống mà một chương trình từ chối bắt đầu vì nó nói "Thiếu tập tin". Làm thế nào để tôi tìm ra tập tin mà nó đang tìm kiếm?
Ole Tange

2

Tôi đã thử nó tracefile. Đối với tôi nó đã cho ít trận đấu hơn nhiều so với của tôi strace ... | sed ... | sort -u. Tôi thậm chí thêm -s256vào strace(1)dòng lệnh nhưng nó không giúp được gì nhiều ...

Sau đó, tôi đã thử nó loggedfs. Đầu tiên nó thất bại vì tôi không có quyền truy cập đọc / ghi vào thư mục mà tôi đã cố gắng đăng nhập với nó. Sau khi làm chmod 755 tạm thời, tôi đã nhận được một số lượt truy cập ...

Nhưng, đối với tôi, làm như sau có vẻ hiệu quả nhất:

inotifywait -m -r -e OPEN /path/to/traced/directory

Và sau đó xử lý hậu quả đầu ra sau khi chạy quá trình quan tâm.

Điều này không bắt được các tập tin truy cập bên ngoài của thư mục theo dõi cũng như không biết liệu một số quy trình khác có truy cập cùng một cây thư mục hay không, nhưng trong nhiều trường hợp, đây là công cụ đủ tốt để hoàn thành công việc.

EDIT: inotifywait không bắt được quyền truy cập symlink (chỉ các mục tiêu sau khi symlink được giải quyết). Tôi đã bị ảnh hưởng bởi điều này khi tôi lưu trữ các thư viện được truy cập bởi một chương trình để sử dụng trong tương lai. Đã sử dụng một số hack toàn cầu perl bổ sung để chọn các liên kết tượng trưng dọc theo các thư viện được thông báo để hoàn thành công việc trong một trường hợp cụ thể đó.

EDIT2: ít nhất là khi inotifying tập tin và liên kết tượng trưng bản thân từ dòng lệnh inotifywait (ví dụ inotifywait -m file symlinkhay inotifywait symlink file) đầu ra sẽ hiển thị tiếp cận với cái nào là đầu tiên trong dòng lệnh (không phân biệt đó, filecủa symlinkđược truy cập). inotifywait không hỗ trợ IN_DONT_FOLLOW - điều mà khi tôi thử lập trình chỉ khiến người ta thấy quyền truy cập file(có thể hoặc không, là điều người ta mong đợi ...) bất kể thứ tự trong dòng lệnh


"Đối với tôi, nó cho kết quả trùng khớp ít hơn nhiều so với của riêng tôi" Bạn có thể chia sẻ một ví dụ về việc tracefilethiếu quyền truy cập tệp không?
Ole Tange

Tôi không chắc chắn chính xác những gì bạn đang hỏi :) ... Nếu tôi cố gắng tìm các tệp bên trong / path / to / trained / thư mục / Tôi thấy MỞ trong đầu ra inotify ... NHƯNG stat (1) ing các tệp tôi dường như để không có kết quả trong một vài trường hợp tôi đã thử (tôi tự hỏi tại sao, một số bộ nhớ đệm ẩn nội dung thư mục đọc từ chế độ xem)
Tomi Ollila

Tôi đang bình luận bài đăng fanotify bên dưới (tôi chỉ có 21 danh tiếng, mặc dù tôi đã có tài khoản hơn một thập kỷ; yêu cầu 50 bình luận luôn là trở ngại đối với tôi ...) - fanotify là công cụ tốt, nhưng không thể đi xung quanh vấn đề hủy đăng ký symlink (ví dụ trong trường hợp liên kết tượng trưng, ​​tệp cuối cùng được truy cập được tìm thấy bằng cách đọc / Proc / self / fd / <fd> .. anyway +1: ing câu trả lời: D
Tomi Ollila

1

Mặc dù nó có thể không cung cấp cho bạn đủ quyền kiểm soát (nhưng?) Tôi đã viết một chương trình, ít nhất đáp ứng một phần nhu cầu của bạn, sử dụng fanotify của linux-kernel và unshare để chỉ giám sát các tệp được sửa đổi (hoặc đọc) bởi một quy trình cụ thể và các con của nó . So với strace, nó khá nhanh (;

Nó có thể được tìm thấy trên https://github.com/tycho-kirchner/shournal

Ví dụ trên vỏ:

$ shournal -e sh -c 'echo hi > foo1; echo hi2 > foo2'
$ shournal -q --history 1
  # ...
  Written file(s):                                                                                                                                                                              
 /tmp/foo1 (3 bytes) Hash: 15349503233279147316                                                                                                                                             
 /tmp/foo2 (4 bytes) Hash: 2770363686119514911    
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.