Bir program tarafından hangi dosyalara erişildiğini gösteren araçlar?


12

AppArmor şikayet modu gibi karmaşık araçlar için gitmiyorum, hangi dosyaların belirli bir program tarafından erişildiğini söylemek için kolay araçlara ihtiyacım var.


7
Hangi İşletim Sistemi altında?
Jeff Schaller

Ayrıca, programın dosyalara hangi şekilde erişmesini beklediğinizi açıklamak yararlı olabilir - okuma, yazma, ekleme, sadece alma fstat()veya lstat()bilgi, vb.
Sergiy Kolodyazhnyy

Hem Suse hem de Ubuntu
Boll19

Hiçbir şekilde bilmem gerek, fstat () veya lstat () programlama mı?
Boll19

Sergiy Kolodyazhnyy'nin başka bir deyişle açıklaması: bir program bir dosyanın uzunluğunu, değişiklik tarihini, izinlerini veya diğer özelliklerini kontrol eder, ancak dosyanın verilerine erişmezse, bunu "dosyaya erişme" olarak sayabilir misiniz?
telcoM

Yanıtlar:


12

Chris Down'a göre, halihazırda çalışan bir işlemi strace -pincelemek , strace'i sonlandırdığınız veya işlemin kendisi bitene kadar hangi dosyaları açtığını görmek için kullanabilirsiniz.

Bir işlemin tamamı boyunca açılan dosyaları görmek istiyorsanız , en baştan straceçalıştırılabilir adla kullanın . Ekleme -f, çatallı alt işlemlerin de raporlanmasını sağlar. Misal

# strace -e open -f /bin/id
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libpcre.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
open("/proc/thread-self/attr/current", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/proc/self/task/1581/attr/current", O_RDONLY|O_CLOEXEC) = 3
open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_US.utf8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_US/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en.UTF-8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en.utf8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 3
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libnss_files.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 3
open("/etc/group", O_RDONLY|O_CLOEXEC)  = 3
open("/etc/group", O_RDONLY|O_CLOEXEC)  = 3
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
+++ exited with 0 +++
#

Kullanılması lsofbir süreç dosyaları görmek için şu anda açık vardır

# lsof -p $(pidof NetworkManager)
COMMAND   PID USER   FD      TYPE             DEVICE  SIZE/OFF     NODE NAME
NetworkMa 722 root  cwd       DIR              253,0       224       64 /
NetworkMa 722 root  rtd       DIR              253,0       224       64 /
NetworkMa 722 root  txt       REG              253,0   2618520   288243 /usr/sbin/NetworkManager
NetworkMa 722 root  mem       REG              253,0     27776    34560 /usr/lib64/libnss_dns-2.17.so
[...]
#

SystemTap'iniz varsa, açılan tüm dosyalar için tüm ana bilgisayarı izleyebilirsiniz.

[root@localhost tmp]# cat mon
#!/usr/bin/env stap
probe syscall.open { printf ("pid %d program %s opened %s\n", pid(), execname(), filename) }
# ./mon
pid 14813 program touch opened "/etc/ld.so.cache"
pid 14813 program touch opened "/lib64/libc.so.6"
pid 14813 program touch opened 0x7f7a8c6ec8d0
pid 14813 program touch opened "foo2"
[...]
#

2
openilgili tek sistem çağrısı değil. Örneğin, dosya tanımlayıcıları bir unix soketi üzerinden işlemler arasında geçirmek mümkündür ve openatbir dosya da açabilen sistem çağrısı vardır.
kasperd

---- SIGUSR1 {si_signo = SIGUSR1, si_code = SI_TKILL, si_pid = 6026, si_uid = 1002} ---- bu nedir
Boll19

kaspers, strace output komutunda sadece 'openat' aramam gerekiyor mu?
Boll19

Bir dosya açmaya çalışıyorsanız (ancak dosya olmayabilir) 'strace' çıktılarında da görüntüleniyor mu?
Boll19

Boll19, var olmadıkları için açılamayan dosyalar içinde mutlu bir şekilde rapor edilir strace, örnekteki ENOENT satırlarına bakın.
steve

5

opensnoopKaputun altında eBPF kullanan BCC'den kullanabilirsiniz :

# ./opensnoop -p 1576
PID    COMM      FD ERR PATH
1576   snmpd     11   0 /proc/sys/net/ipv6/conf/lo/forwarding
1576   snmpd     11   0 /proc/sys/net/ipv6/neigh/lo/base_reachable_time_ms
1576   snmpd      9   0 /proc/diskstats
1576   snmpd      9   0 /proc/stat
1576   snmpd      9   0 /proc/vmstat
[...]

Bu, sistem çağrılarını yeniden başlatmak yerine kprobes kullandığından oldukça performanslıdır strace.

Ayrıca ile yapabilirsiniz strace(potansiyel ile -fbir parçası olarak syscalls yeniden başlatmayı içeren, ama operasyondan onun yolunu, takip süreci çocuk takip etmek) ptrace biraz başvurunuzu yavaşlatacaktır:

# strace -e open -p 15735
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/gconv/gconv-modules.cache", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/gconv/gconv-modules", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/python2.7/site-packages", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 4
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
open("/etc/localtime", O_RDONLY|O_CLOEXEC) = 8
[...]

İsterseniz strace [executable], veya tuşlarını kullanarak başvurunuzu bu şekilde başlatabilirsiniz strace -f [executable].


5

Bir uygulamanın açtığı dosyaları izlemek için en sevdiğim araç, güçlü izleme çerçevesidir sysdig.

Adlı bir program tarafından açılan tüm açık dosyaları izlemek için exe_file:

sudo sysdig -p "proc.name=exe_file %12user.name %6proc.pid %12proc.name %3fd.num %fd.typechar %fd.name" evt.type=open

Sunucuda açılan tüm dosyaları izleme:

sudo sysdig -p "%12user.name %6proc.pid %12proc.name %3fd.num %fd.typechar %fd.name" evt.type=open

Yalnızca ev dizinlerinde (daha sonra inceleyebileceğimiz sysdig -r writetrace.scap.gz) yazma olayları içerecek bir izleme dosyası oluşturma :

sudo sysdig -p "%user.name %proc.name %fd.name" "evt.type=write and fd.name contains /home/" -z -w writetrace.scap.gz

Adında bir işlem sistem çağrısı düzeyinde gördüğünüzde exe_file:

sudo sysdig proc.name=exe_file

Sysdig'in çok sayıda keskisi var, yapabileceği daha ilginç şeyler için bakın:

Ayrıca dtraceLinux'ta çok kullanılmayan, ancak * BSD işletim sistemleriyle hala çokça kullanılan var :

# Files opened by process,
dtrace -n 'syscall::open*:entry { printf("%s %s",execname,copyinstr(arg0)); }'

Ayrıca sysdig, straceve dtrace, ayrıca var ltrace, hangi bir işlemle alınan denir kayıtlar / yakaladığını sinyalleri / dinamik kütüphaneleri / sistem çağrıları /:

ltracebelirtilen komutu çıkana kadar çalıştıran bir programdır. Yürütülen işlem tarafından çağrılan dinamik kitaplık çağrılarını ve bu işlem tarafından alınan sinyalleri keser ve kaydeder. Ayrıca program tarafından yürütülen sistem çağrılarını da kesebilir ve yazdırabilir.

$ltrace exe_file
_libc_start_main(0x400624, 1, 0x7ffcb7b6d7c8, 0x400710 <unfinished ...>  
time(0)                                                                              = 1508018406  
srand(0x59e288e6, 0x7ffcb7b6d7c8, 0x7ffcb7b6d7d8, 0)                                 = 0  
sprintf("mkdir -p -- '/opt/sms/AU/mo'", "mkdir -p -- '%s'", "/opt/sms/AU/mo")        = 28  
system("mkdir -p -- '/opt/sms/AU/mo'" <no return ...>  
--- SIGCHLD (Child exited) ---  
<... system resumed> )                                                               = 0  
rand(2, 0x7ffcb7b6d480, 0, 0x7f9d6d4622b0)                                           = 0x2d8ddbe1  
sprintf("/opt/sms/AU/mo/tmp.XXXXXX", "%s/tmp.XXXXXX", "/opt/sms/AU/mo")      = 29  
mkstemp(0x7ffcb7b6d5c0, 0x40080b, 0x40081a, 0x7ffffff1)                              = 3  
sprintf("/opt/sms/AU/mo/tmp.XXXXXX", "%s/tmp.XXXXXX", "/opt/sms/AU/mo")      = 29  
mkstemp(0x7ffcb7b6d5c0, 0x40080b, 0x40081a, 0x7ffffff1)                              = 4  
+++ exited (status 0) +++  

Program küçükse, objdump -d exe_fileilgilendiği Hoppertüm dosyaları görmek için programı sökmeyi veya sökmeyi / ayrıştırmayı da düşünebilirsiniz .

Daha fazla ayrıntı için bkz. Bir Linux ikili dosyasının ne yaptığını anlama

İlk yaklaşım olarak şunu da yaparım:

strings exe_file

Düşük maliyetli bir yaklaşımdır ve şansla bazı dosya adları şanslı ikili dosyada ASCII modunda mevcut olabilir.

Ayrıca bkz. İlgili cevap Doğru ve yanlış neden bu kadar büyük?

Dağıtımla birlikte gelen ikili dosyalar / dosyalar, kaynakları dağıtımın kaynak havuzlarından veya gerçek yardımcı programın resmi havuzlarından da alabilirsiniz.

Son bir kaynak olarak, ikili dosyada gerçek zamanlı hata ayıklamak için her zaman gdb veya rr gibi araçları kullanabilirsiniz .


aaa43bb66: ~ # sudo proc.name = exe_file sysdig -p "% 12user.name% 6proc.pid% 12proc.name% 3fd.num% fd.typechar% fd.name" evt.type = open Sürücü hatası yüklenemedi açma aygıtı / dev / sysdig0. Kök kimlik bilgilerine sahip olduğunuzdan ve sysdig-sonda modülünün yüklendiğinden emin olun.
Boll19

/ * <pre> aaa43bb66: ~ # sudo proc.name = exe_file sysdig -p "% 12user.name% 6proc.pid% 12proc.name% 3fd.num% fd.typechar% fd.name" evt.type = open Unable / dev / sysdig0 aygıtını açarken sürücü hatası yüklemek için. Kök kimlik bilgilerine sahip olduğunuzdan ve sysdig-sonda modülünün yüklendiğinden emin olun. <code> * /
Boll19

@ Boll19 Orada bir hata var, düzeltildi. Bu mesaj bir sysdighata hakkında görünüyor (ARM kullanıyor musunuz?), Lütfen yeni bir soru gönderin.
Rui F Ribeiro
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.