আমি অ্যাপআর্মার অভিযোগ মোডের মতো জটিল সরঞ্জামগুলির জন্য যাচ্ছি না, নির্দিষ্ট প্রোগ্রাম দ্বারা কোন ফাইলগুলি অ্যাক্সেস করা হয়েছে তা আমাকে বলার জন্য আমার সহজ সরঞ্জামগুলির প্রয়োজন।
fstat()
বা lstat()
তথ্য ইত্যাদি
আমি অ্যাপআর্মার অভিযোগ মোডের মতো জটিল সরঞ্জামগুলির জন্য যাচ্ছি না, নির্দিষ্ট প্রোগ্রাম দ্বারা কোন ফাইলগুলি অ্যাক্সেস করা হয়েছে তা আমাকে বলার জন্য আমার সহজ সরঞ্জামগুলির প্রয়োজন।
fstat()
বা lstat()
তথ্য ইত্যাদি
উত্তর:
ক্রিস ডাউন হিসাবে, আপনি ইতিমধ্যে চলমান প্রক্রিয়াটি strace -p
পরীক্ষা করতে ব্যবহার করতে পারেন , এখন থেকে কোনও ফাইলগুলি কীভাবে খোলা থাকে তা দেখার জন্য আপনি স্ট্রেস বন্ধ করার সময় বা প্রক্রিয়াটি শেষ হওয়ার আগে পর্যন্ত।
আপনি যদি কোনও প্রক্রিয়াটির পুরো সময়কালের জন্য ফাইলগুলি খোলা দেখতে চান তবে শুরু থেকেই, strace
এক্সিকিউটেবল নামটি ব্যবহার করুন । সংযোজন -f
নিশ্চিত করে যে কোনও ফোরকড উপ-প্রক্রিয়াগুলিও প্রতিবেদন করা উচিত। উদাহরণ
# 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 +++
#
lsof
একটি প্রক্রিয়া বর্তমানে কোন ফাইলগুলি খোলে তা দেখতে ব্যবহার করে
# 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
[...]
#
আপনার যদি সিস্টেমট্যাপ থাকে তবে ফাইলগুলি খোলার জন্য আপনি পুরো হোস্টটি পর্যবেক্ষণ করতে পারেন।
[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
একমাত্র প্রাসঙ্গিক কল নয়। উদাহরণস্বরূপ, ইউনিক্স সকেটের মাধ্যমে প্রক্রিয়াগুলির মধ্যে ফাইল বর্ণনাকারীদের পাস করা সম্ভব এবং openat
সিস্টেম কল রয়েছে যা একটি ফাইলও খুলতে পারে।
strace
, উদাহরণে ENOENT লাইনগুলি দেখুন।
আপনি opensnoop
বিসিসি থেকে ব্যবহার করতে পারেন , যা হুডের নীচে ইবিপিএফ ব্যবহার করে:
# ./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
[...]
এটি বেশ পারফরম্যান্স, যেহেতু এটি সিস্টপলগুলি পুনরায় আরম্ভ করার পরিবর্তে কেপ্রোব ব্যবহার strace
করে , যেমন করে।
এছাড়াও আপনি সাথে এটা করতে পারেন strace
(সম্ভাব্য সঙ্গে -f
কিন্তু অপারেটিং তার পথ, অংশ হিসেবে syscalls পুনরায় চালু জড়িত আঁকা প্রক্রিয়া 'শিশুদের অনুসরণ করতে) ptrace কিছুটা আপনার আবেদন মন্দীভূত হবে:
# 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
[...]
আপনি যদি আবেদন করতে চান তবে এইভাবে ব্যবহার করতে strace [executable]
বা ব্যবহার করতে শুরু করতে পারেন strace -f [executable]
।
কোন অ্যাপ্লিকেশন ফাইল খুলবে তা নিরীক্ষণের জন্য আমার প্রিয় সরঞ্জামটি শক্তিশালী পর্যবেক্ষণ কাঠামো sysdig
।
নামের একটি প্রোগ্রাম দ্বারা খোলা সমস্ত উন্মুক্ত ফাইল পর্যবেক্ষণের জন্য exe_file
:
sudo sysdig -p "proc.name=exe_file %12user.name %6proc.pid %12proc.name %3fd.num %fd.typechar %fd.name" evt.type=open
সার্ভারে খোলা সমস্ত ফাইল নিরীক্ষণ:
sudo sysdig -p "%12user.name %6proc.pid %12proc.name %3fd.num %fd.typechar %fd.name" evt.type=open
একটি ট্রেস ফাইল তৈরি করা যা কেবলমাত্র হোম ডিরেক্টরিগুলিতে লেখার ইভেন্টগুলি ধারণ করে (যা আমরা এর সাথে পরে পরিদর্শন করতে পারি sysdig -r writetrace.scap.gz
):
sudo sysdig -p "%user.name %proc.name %fd.name" "evt.type=write and fd.name contains /home/" -z -w writetrace.scap.gz
সিস্কল স্তরে সমস্ত কিছু দেখতে একটি প্রক্রিয়া নামের প্রক্রিয়া exe_file
করে:
sudo sysdig proc.name=exe_file
সিসডিগের অনেকগুলি ছিনুক রয়েছে, এটি করতে পারে এমন আরও আকর্ষণীয় কাজের জন্য দেখুন:
আপনি এটি পেয়েছেন dtrace
যা লিনাক্সে খুব বেশি ব্যবহৃত হয় না, তবে এখনও * বিএসডি অপারেটিং সিস্টেমের সাথে প্রচুর ব্যবহার করা হচ্ছে:
# Files opened by process,
dtrace -n 'syscall::open*:entry { printf("%s %s",execname,copyinstr(arg0)); }'
এছাড়াও sysdig
, strace
এবং dtrace
, ltrace
আপনিও পেয়েছেন , যা কোনও রেকর্ড / ইন্টারসেপ্ট সিগন্যাল / ডায়নামিক লাইব্রেরি / সিস্টেম কল যা কল করে / একটি প্রক্রিয়া দ্বারা প্রাপ্ত:
ltrace
এটি এমন একটি প্রোগ্রাম যা প্রস্থান না হওয়া অবধি কেবল নির্দিষ্ট কমান্ডটি চালায়। এটি গতিশীল লাইব্রেরি কলগুলি বাধাগ্রস্ত করে এবং রেকর্ড করে যা কার্যকর করা প্রক্রিয়া দ্বারা কল করা হয় এবং সেই প্রক্রিয়াটি প্রাপ্ত সংকেতগুলি। এটি প্রোগ্রাম দ্বারা সম্পাদিত সিস্টেম কলগুলিও বাধা এবং মুদ্রণ করতে পারে।
$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) +++
প্রোগ্রামটি যদি ছোট হয় objdump -d exe_file
তবে এর সাথে যুক্ত Hopper
সমস্ত ফাইল দেখার জন্য আপনি এটির সাথে ডিসস্যাম্বলিং বা ডিসস্যাম্বলিং / ডিসকম্পিলিং বিবেচনা করতে পারেন।
আরও তথ্যের জন্য দেখুন: লিনাক্স বাইনারি কী করছে তা বোঝা
প্রথম পদ্ধতির হিসাবে, আমি আরও করবো:
strings exe_file
এটি একটি স্বল্প ব্যয়ের পদ্ধতির, এবং ভাগ্যের সাথে কিছু ফাইলের নাম কেবল ভাগ্য সহ বাইনারি ফাইলটিতে ASCII মোডে উপস্থিত থাকতে পারে।
সম্পর্কিত উত্তরও দেখুন সত্য এবং মিথ্যা এত বড় কেন?
যদি বাইনারি / ফাইলগুলি বিতরণে আসে তবে আপনি বিতরণের উত্স সংগ্রহস্থলগুলি, বা প্রকৃত ইউটিলিটির অফিসিয়াল সংগ্রহস্থলগুলি থেকে উত্সগুলিও পেতে পারেন।
শেষ সংস্থান হিসাবে, আপনি বাইনারিটি রিয়েল টাইমে ডিবাগ করতে সর্বদা gdb বা rr এর মতো সরঞ্জাম ব্যবহার করতে পারেন ।
sysdig
বাগ সম্পর্কে মনে হচ্ছে (আপনি কি এআরএম ব্যবহার করছেন?), দয়া করে এটির জন্য একটি নতুন প্রশ্ন পোস্ট করুন।