আসুন একসাথে একটি প্রকল্প তৈরি করি!
লিনাক্স টুল যেমন ps , top &netstat দারুণ।
আপনার সিস্টেমের সাথে কী ঘটছে সে সম্পর্কে তারা আপনাকে অনেক তথ্য দেয়।
- কিন্তু তারা কিভাবে কাজ করে?
- তারা তাদের সমস্ত তথ্য কোথা থেকে পায়?
- আমরা কীভাবে আমাদের নিজস্ব সরঞ্জাম তৈরি করতে এটি ব্যবহার করতে পারি?
এই পোস্টে আমরা একসাথে তিনটি জনপ্রিয় লিনাক্স টুল পুনরায় তৈরি করব।
আপনি একটি 2×1 খাবার পেতে যাচ্ছেন, কিছু রুবি কৌশল শিখবেন এবং একই সাথে দরকারী লিনাক্স জ্ঞান পাবেন! 🙂
স্থিতি তথ্য খোঁজা
সুতরাং আসুন এই সমস্ত সরঞ্জামগুলি তাদের তথ্য কোথায় পায় সেই প্রশ্নের উত্তর দেওয়ার চেষ্টা করি৷
উত্তরটি proc ফাইল সিস্টেমে রয়েছে!
আপনি যদি /proc এর ভিতরে তাকান ডিরেক্টরিটি আপনার কম্পিউটারের অন্য যেকোন ডিরেক্টরির মতোই একগুচ্ছ ডিরেক্টরি এবং ফাইলের মতো দেখাবে৷
এগুলি আসল ফাইল নয়, এটি লিনাক্স কার্নেলের ব্যবহারকারীদের কাছে ডেটা প্রকাশ করার একটি উপায় মাত্র৷
এটি খুবই সুবিধাজনক কারণ সেগুলিকে সাধারণ ফাইলের মতোই বিবেচনা করা যেতে পারে, যার মানে হল যে আপনি কোনো বিশেষ সরঞ্জাম ছাড়াই সেগুলি পড়তে পারেন৷
লিনাক্স জগতে অনেক কিছুই এই রকম কাজ করে।
আপনি যদি অন্য একটি উদাহরণ দেখতে চান তাহলে /dev দেখুন ডিরেক্টরি।
এখন আমরা বুঝতে পেরেছি যে আমরা কী নিয়ে কাজ করছি, আসুন /proc এর বিষয়বস্তুগুলি একবার দেখে নেওয়া যাক ডিরেক্টরি…
110104105111101511469114741155211655
এটি একটি ছোট নমুনা, কিন্তু আপনি দ্রুত একটি প্যাটার্ন লক্ষ্য করতে পারেন৷
৷ওই সব সংখ্যা কী?
ঠিক আছে, দেখা যাচ্ছে যে এগুলি পিআইডি (প্রসেস আইডি)।
প্রতিটি এন্ট্রিতে একটি নির্দিষ্ট প্রক্রিয়া সম্পর্কে তথ্য থাকে।
আপনি যদি ps চালান আপনি দেখতে পারেন কিভাবে প্রতিটি প্রক্রিয়ার সাথে একটি পিআইডি যুক্ত থাকে:
PID TTY টাইম CMD15952 pts/5 00:00:00 ps22698 pts/5 00:00:01 bash
এটি থেকে আমরা অনুমান করতে পারি যে ps যা করে তা কেবল /proc এর উপর পুনরাবৃত্তি করে। ডিরেক্টরি এবং এটি খুঁজে পাওয়া তথ্য মুদ্রণ.
আসুন দেখি সেই সংখ্যাযুক্ত ডিরেক্টরিগুলির মধ্যে কী রয়েছে:
attrautogroupauxvcgroupclear_refscmdlinecommcpusetcwdenvironexefd
এটি স্থান বাঁচানোর জন্য একটি নমুনা, তবে আমি আপনাকে সম্পূর্ণ তালিকাটি একবার দেখার জন্য উত্সাহিত করি৷
৷এখানে কিছু আকর্ষণীয় এন্ট্রি আছে :
| এন্ট্রি | বর্ণনা |
|---|---|
| comm | প্রোগ্রামের নাম |
| cmdline | এই প্রক্রিয়াটি চালু করতে ব্যবহৃত কমান্ড |
| পরিবেশ | পরিবেশ ভেরিয়েবল যা দিয়ে এই প্রক্রিয়াটি শুরু হয়েছিল |
| স্থিতি | প্রসেস স্ট্যাটাস (চলমান, ঘুমানো…) এবং মেমরি ব্যবহার |
| fd | ডিরেক্টরি যেটিতে ফাইল বর্ণনাকারী (ওপেন ফাইল, সকেট...) |
এখন যেহেতু আমরা এটি জানি আমাদের কিছু সরঞ্জাম লেখা শুরু করতে সক্ষম হওয়া উচিত!
চলমান প্রোগ্রামগুলি কীভাবে তালিকাভুক্ত করবেন
চলুন শুরু করা যাক /proc-এর অধীনে থাকা সমস্ত ডিরেক্টরিগুলির একটি তালিকা পেয়ে .
আমরা Dir ব্যবহার করে এটি করতে পারি ক্লাস।
উদাহরণ :
Dir.glob("/proc/[0-9]*")
লক্ষ্য করুন কিভাবে আমি একটি সংখ্যা পরিসর ব্যবহার করেছি, কারণ হল যে /proc এর অধীনে অন্যান্য ফাইল রয়েছে যে আমরা এখনই চিন্তা করি না, আমরা শুধুমাত্র সংখ্যাযুক্ত ডিরেক্টরি চাই।
এখন আমরা এই তালিকার উপর পুনরাবৃত্তি করতে পারি এবং দুটি কলাম প্রিন্ট করতে পারি, একটি পিআইডি সহ এবং অন্যটি প্রোগ্রামের নামের সাথে।
উদাহরণ :
pids =Dir.glob("/proc/[0-9]*") "PID\tCMD"পুট করে "-" * 15pids.each do |pid| cmd =File.read(pid + "/comm") pid =pid.scan(/\d+/). প্রথমে "#{pid}\t#{cmd}" end এবং এটিই আউটপুট :
PID CMD---------------1 systemd2 kthreadd3 ksoftirqd/05 kworker/07 মাইগ্রেশন/08 rcu_preempt9 rcu_bh10 rcu_sched
আরে, মনে হচ্ছে আমরা এইমাত্র ps তৈরি করেছি ! হ্যাঁ, এটি আসল থেকে সমস্ত অভিনব বিকল্পগুলিকে সমর্থন করে না, তবে আমরা কিছু কাজ করেছি৷
কে শুনছে?
চলুন netstat প্রতিলিপি করার চেষ্টা করি এখন, এই আউটপুট দেখতে কেমন (-ant সহ পতাকা হিসাবে)।
সক্রিয় ইন্টারনেট সংযোগ (সার্ভার এবং প্রতিষ্ঠিত) Proto Recv-Q Send-Q স্থানীয় ঠিকানা বিদেশী ঠিকানা রাজ্য tcp 0 0 127.0.0.1:5432 0.0.0.0:* শুনুন tcp 0 0 192.168.1.82:392168.1.82:3951214.5214. প্রতিষ্ঠিত
আমরা এই তথ্য কোথায় পেতে পারি? আপনি যদি বলেন “/proc এর ভিতরে " তুমি ঠিক বলছো! আরও সুনির্দিষ্ট হতে আপনি এটি /proc/net/tcp-এ খুঁজে পেতে পারেন .
কিন্তু একটি সামান্য সমস্যা আছে, এটি netstat এর মত কিছু দেখায় না আউটপুট!
0:0100007F:1538 00000000:0000 0 এ 00000000:0000000000:00000000 000000 1001 0 92161:2E58A8C0:9A6A6 এ 600000000000000000000000000000000এর মানে হল যে আমাদের রেগুলার এক্সপ্রেশন সহ কিছু পার্সিং করতে হবে। আপাতত শুধু স্থানীয় ঠিকানা এবং স্ট্যাটাস নিয়ে চিন্তা করা যাক।
আমি যে রেজেক্স নিয়ে এসেছি তা এখানে :
LINE_REGEX =/\s+\d+:(?\w+):(? \w+) \w+:\w+ (? \w+)/ এটি আমাদের কিছু হেক্সাডেসিমেল মান দেবে যা আমাদের দশমিকে রূপান্তর করতে হবে। আসুন একটি ক্লাস তৈরি করি যা আমাদের জন্য এটি করবে।
শ্রেণি TCPInfo def initialize(line) @data =parse(line) end def parse(line) line.match(LINE_REGEX) end def local_port @data["local_port"].to_i(16) শেষ # হেক্সকে নিয়মিত রূপান্তর করুন IP নোটেশন def local_addr decimal_to_ip(@data["local_addr"].to_i(16)) শেষ অবস্থা ={ "0A" => "শ্রবণ", "01" => "স্থাপিত", "06" => "সময়_অপেক্ষা", "08" => "CLOSE_WAIT" } def স্থিতি কোড =@data["status"] STATUSES.fetch(code, "UNKNOWN") end # এই নিয়ে খুব বেশি চিন্তা করবেন না। এটা কিছু বাইনারি গণিত. def decimal_to_ip(decimal) ip =[] ip <<(decimal>> 24 &0xFF) ip <<(decimal>> 16 &0xFF) ip <<(decimal>> 8 &0xFF) ip <<(দশমিক এবং 0xFF) ip.join(".") endendএকটি সুন্দর টেবিল বিন্যাসে ফলাফল প্রিন্ট করা শুধুমাত্র জিনিস বাকি আছে.
'table_print'tp সংযোগের প্রয়োজনউদাহরণ আউটপুট :
<পূর্ব>স্থিতি | LOCAL_PORT | স্থানীয়_এডিডিআর ------------|------------|---------------শুনছেন | 5432 | 127.0.0.1 প্রতিষ্ঠিত | 39530 | 192.168.88.46
হ্যাঁ, এই রত্নটি দুর্দান্ত!
আমি এইমাত্র এটি সম্পর্কে খুঁজে পেয়েছি এবং মনে হচ্ছে আমাকে ljust এর সাথে ঘোরাঘুরি করতে হবে না / rjust আবার 🙂
আমার পোর্ট ব্যবহার করা বন্ধ করুন!
আপনি কি কখনও এই বার্তাটি দেখেছেন?
ঠিকানা ইতিমধ্যেই ব্যবহার করা হচ্ছে - "localhost" পোর্ট 5000 এর জন্য bind(2)
উমম…
আমি ভাবছি কোন প্রোগ্রামটি সেই পোর্টটি ব্যবহার করছে৷
৷আসুন জেনে নেওয়া যাক :
fuser -n tcp -v 5000PORT USER PID ACCESS CMD5000/tcp রুবিগাইড 30893 F.... nc
আহ, তাই আমাদের অপরাধী আছে!
এখন আমরা এই প্রোগ্রামটি বন্ধ করতে পারি যদি আমরা এটি চালু না করতে চাই এবং এটি আমাদের পোর্টকে মুক্ত করবে। "ফিউজার" প্রোগ্রামটি কীভাবে খুঁজে পেল কে এই পোর্টটি ব্যবহার করছে?
আপনি এটা অনুমান করেছেন!
/proc ফাইল সিস্টেম আবার।
প্রকৃতপক্ষে, এটি দুটি জিনিসকে একত্রিত করে যা আমরা ইতিমধ্যেই কভার করেছি:প্রক্রিয়া তালিকার মধ্য দিয়ে হাঁটা এবং /proc/net/tcp থেকে সক্রিয় সংযোগগুলি পড়া .
আমাদের শুধু একটি অতিরিক্ত পদক্ষেপ দরকার :
PID-এর সাথে ওপেন পোর্টের তথ্য মিলানোর উপায় খুঁজুন।
আমরা যদি TCP ডেটা দেখি যা আমরা /proc/net/tcp থেকে পেতে পারি , PID সেখানে নেই। কিন্তু আমরা ইনোড নম্বর ব্যবহার করতে পারি।
"একটি ইনোড একটি ডেটা কাঠামো যা একটি ফাইল সিস্টেম অবজেক্টকে উপস্থাপন করতে ব্যবহৃত হয়।" – উইকিপিডিয়া
ম্যাচিং প্রক্রিয়া খুঁজে পেতে আমরা কীভাবে ইনোড ব্যবহার করতে পারি? আমরা যদি fd এর নিচে দেখি একটি প্রক্রিয়ার ডিরেক্টরি যা আমরা জানি যে একটি খোলা পোর্ট আছে, আমরা এইরকম একটি লাইন খুঁজে পাব:
/proc/3295/fd/5 -> সকেট:[12345]
বন্ধনীর মধ্যে থাকা সংখ্যাটি হল ইনোড সংখ্যা। তাই এখন আমাদের যা করতে হবে তা হল সমস্ত ফাইলের উপর পুনরাবৃত্তি করা এবং আমরা ম্যাচিং প্রক্রিয়াটি খুঁজে পাব।
এটি করার একটি উপায় আছে :
x =Dir.glob("/proc/[0-9]*/fd/*"). খুঁজুন do |fd| File.readlink(fd).অন্তর্ভুক্ত? "সকেট:[#{socket_inode}]" রেসকিউ nilendpid =x.scan(/\d+/).firstname =File.readlink("/proc/#{pid}/exe")"পোর্ট #{hex_port.to_i( 16)} #{name} (#{pid})" ব্যবহার করছে উদাহরণ আউটপুট:
/usr/bin/postgres (474) দ্বারা ব্যবহৃত পোর্ট 5432
অনুগ্রহ করে মনে রাখবেন যে আপনাকে এই কোডটি রুট হিসাবে বা প্রক্রিয়া মালিক হিসাবে চালাতে হবে৷
অন্যথায় আপনি /proc-এর ভিতরে প্রক্রিয়ার বিবরণ পড়তে পারবেন না .
উপসংহার
এই পোস্টে আপনি শিখেছেন যে Linux ভার্চুয়াল /proc এর মাধ্যমে প্রচুর ডেটা প্রকাশ করে নথি ব্যবস্থা. এছাড়াও আপনি /proc-এর অধীনে ডেটা ব্যবহার করে ps, netstat এবং fuser-এর মতো জনপ্রিয় লিনাক্স টুলগুলি পুনরায় তৈরি করতে শিখেছেন। .
নিচের নিউজলেটারে সাবস্ক্রাইব করতে ভুলবেন না যাতে আপনি পরবর্তী পোস্টটি মিস করবেন না। 🙂