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.
fstat()
veya lstat()
bilgi, vb.
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.
fstat()
veya lstat()
bilgi, vb.
Yanıtlar:
Chris Down'a göre, halihazırda çalışan bir işlemi strace -p
incelemek , 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ı lsof
bir 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"
[...]
#
open
ilgili 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 openat
bir dosya da açabilen sistem çağrısı vardır.
strace
, örnekteki ENOENT satırlarına bakın.
opensnoop
Kaputun 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 -f
bir 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]
.
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 dtrace
Linux'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
, strace
ve 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ı /:
ltrace
belirtilen 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_file
ilgilendiği Hopper
tü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 .
sysdig
hata hakkında görünüyor (ARM kullanıyor musunuz?), Lütfen yeni bir soru gönderin.