কোন প্রোগ্রাম দ্বারা কোন ফাইল অ্যাক্সেস করা যায় তা প্রদর্শনের সরঞ্জামগুলি?


12

আমি অ্যাপআর্মার অভিযোগ মোডের মতো জটিল সরঞ্জামগুলির জন্য যাচ্ছি না, নির্দিষ্ট প্রোগ্রাম দ্বারা কোন ফাইলগুলি অ্যাক্সেস করা হয়েছে তা আমাকে বলার জন্য আমার সহজ সরঞ্জামগুলির প্রয়োজন।


7
কোন অপারেটিং সিস্টেমের আওতায়?
জেফ স্ক্যালার হলেন

আপনি কীভাবে প্রোগ্রামটি ফাইলগুলি অ্যাক্সেস করতে পারবেন - পড়া, লেখা, সংযোজন, কেবলমাত্র প্রাপ্তি fstat()বা lstat()তথ্য ইত্যাদি
সের্গি কলডিয়াজহনি


কোন উপায় নেই আমার কীভাবে জানতে হবে, এটি কি fstat () বা lstat () প্রোগ্রামিং করছে?
বোল 19

সের্গেয় কোলোডিয়াজনির মন্তব্য অন্য কথায়: কোনও প্রোগ্রাম যদি কোনও ফাইলের দৈর্ঘ্য, পরিবর্তনের তারিখ, অনুমতি বা অন্যান্য বৈশিষ্ট্যগুলি পরীক্ষা করে তবে ফাইলের ডেটা অ্যাক্সেস না করে তবে আপনি এটিকে "ফাইল অ্যাক্সেস" হিসাবে গণ্য করবেন কিনা?
telcoM

উত্তর:


12

ক্রিস ডাউন হিসাবে, আপনি ইতিমধ্যে চলমান প্রক্রিয়াটি 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"
[...]
#

2
openএকমাত্র প্রাসঙ্গিক কল নয়। উদাহরণস্বরূপ, ইউনিক্স সকেটের মাধ্যমে প্রক্রিয়াগুলির মধ্যে ফাইল বর্ণনাকারীদের পাস করা সম্ভব এবং openatসিস্টেম কল রয়েছে যা একটি ফাইলও খুলতে পারে।
ক্যাস্পারড

---- SIGUSR1 {si_signo = SIGUSR1, si_code = SI_TKILL, si_pid = 6026, si_uid = 1002} ---- কি
বোল 19

ক্যাস্পারস, আমি কেবল স্ট্রেস আউটপুট কমান্ডে 'ওপেন্যাট' অনুসন্ধান করতে চাই?
বল

একটি ফাইল খোলার চেষ্টা করছেন (তবে ফাইলটি বিদ্যমান নাও থাকতে পারে) 'স্ট্রেস' আউটপুটগুলিতেও প্রদর্শিত হবে?
বোল 19

বল 19, যে ফাইলগুলি বিদ্যমান না থাকার কারণে খুলতে ব্যর্থ হয় সেগুলির মধ্যে খুশির সাথে রিপোর্ট করা হয় strace, উদাহরণে ENOENT লাইনগুলি দেখুন।
স্টিভ

5

আপনি 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]


5

কোন অ্যাপ্লিকেশন ফাইল খুলবে তা নিরীক্ষণের জন্য আমার প্রিয় সরঞ্জামটি শক্তিশালী পর্যবেক্ষণ কাঠামো 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 এর মতো সরঞ্জাম ব্যবহার করতে পারেন ।


aaa43bb66: ~ # sudo proc.name = exe_file sysdig -p "% 12user.name% 6proc.pid% 12proc.name% 3fd.num% fd.typechar% fd.name" evt.type = open ড্রাইভার ত্রুটি লোড করতে অক্ষম খোলার ডিভাইস / dev / sysdig0। আপনার কাছে রুট শংসাপত্র রয়েছে এবং সিসডিগ-প্রোব মডিউলটি লোড হয়েছে কিনা তা নিশ্চিত করুন।
Boll19

/ * <pre> aaa43bb66: ~ # sudo proc.name = exe_file sysdig -p "% 12user.name% 6proc.pid% 12proc.name% 3fd.num% fd.typechar% fd.name" evt.type = উন্মুক্ত অক্ষম ড্রাইভার ত্রুটি খোলার ডিভাইস / dev / sysdig0 লোড করতে। নিশ্চিত করুন যে আপনি মূল পরিচয়পত্র আছে এবং যে sysdig-প্রোবের মডিউল লোড হয় করুন <কোড> * /।
Boll19

@ বল 19 সেখানে একটি ত্রুটি পেয়েছে, সংশোধন করেছে। এই বার্তাটি কোনও sysdigবাগ সম্পর্কে মনে হচ্ছে (আপনি কি এআরএম ব্যবহার করছেন?), দয়া করে এটির জন্য একটি নতুন প্রশ্ন পোস্ট করুন।
রুই এফ রিবেইরো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.