Taming Your Linux Jungle: A Beginner's Guide to User Management, File Permissions, and Environment Mastery

Taming Your Linux Jungle: A Beginner's Guide to User Management, File Permissions, and Environment Mastery

লিনাক্স সিস্টেমের ইউজার ম্যানেজমেন্ট, ফাইল পারমিশন সহ এনভায়রনমেন্ট ভ্যারিয়েবল ইত্যাদি বিষয়ে বিস্তারিত আলোচনা

Environment Variables

প্রোগ্রামিং ল্যাঙ্গুয়েজে আমরা ডেটা সংরক্ষণ এবং পুনায় ব্যবহার করা সহ আরো বিভিন্ন কাজের জন্য বিভিন্ন ধরনের ভ্যারিয়েবল ব্যবহার করা থাকি। ঠিক তেমনি কোনো অপারেটিং সিস্টেমের মধ্যে বিভিন্ন অ্যাপ্লিকেশনের কনফিগারেশন সেটিং সমূহকে সংরক্ষণ করার কাজে ইনভাইরনমেন্ট ভ্যারিয়েবলের ব্যবহার হয়ে থাকে।

আমরা যদি আমাদের লিনাক্স ডিস্ট্রিবিউশনের সকল ইনভাইরনমেন্ট ভ্যারিয়েবল দেখতে চাই তাহলে, আমাদের টার্মিনালে printenv এই কমান্ডটা রান করলেই হবে।

টার্মিনালে এখন আমরা HOSTNAME , PWD , HOME , PATH ইত্যাদি ভ্যারিয়েবল key=value দেখতে পাচ্ছি। এদের মধ্যে PATH এই ভ্যারিয়েবল খুবই গুরুত্বপূর্ণ। এই PATH ভ্যারিয়েবলে কিছু ডাইরেক্টরি সুনির্দিষ্ট করে দেওয়া থাকে। আমরা যখন কোনো প্রোগ্রামকে কমান্ডলাইনের মাধ্যমে রান করতে চাই তখন, আমাদের অপারেটিং সিস্টেম সেই প্রোগ্রামকে খুঁজতে থাকে। এক ক্ষেত্রে আমাদের অপারেটিং সিস্টেম সম্পূর্ণ হার্ডড্রাইভে না খুঁজে PATH ভ্যারিয়েবলে সুনির্দিষ্ট করে দেওয়া ডাইরেক্টরি গুলতে খুঁজে। এখনে প্রতিটা ডাইরেক্টরি কোলনের মাধ্যে আলাদা করা আছে PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin

অনেক সময় কোনো প্রোগ্রামকে কমান্ডলাইনের মাধ্যমে রান করতে চাইলে program or command not found এই ধরনের সমস্যা দেখা যায়, যদিও সেই প্রোগ্রাম বা অ্যাপ্লিকেশন আমাদের অপারেটিং সিস্টেমে ইনিস্টল করা থাকে। এর কারণ হল সেই প্রোগ্রামের ইনিস্টলেশন ডাইরেক্টরি PATH ভ্যারিয়েবলে অপারেটিং সিস্টেম খুঁজে পায়নি।

আমরা প্রত্যেকটা ভ্যারিয়েবলকে আলাদা করে দেখতে পারি। এজন্য টার্মিনালে printenv "variable_name" অথবা echo $"variable_name" এই কমান্ড ব্যবহার করতে পারি।

কিভাবে আমরা কাস্টম এনভায়রনমেন্ট ভ্যারিয়েবল সেট করব?

এনভায়রনমেন্ট ভ্যারিয়েবল সেট করার জন্য আমরা export কমান্ড ব্যবহার করব। টার্মিনালে export "variable_name"="value" এই কমান্ড রান করলে আমাদের কাঙ্ক্ষিত ভ্যারিয়েবল সেট হয়ে যাবে।

এইভাবে এনভায়রনমেন্ট ভ্যারিয়েবল সেট করলে এটি শুধু আমাদের বর্তমান টার্মনাল সেশনের জন্য কাজ করবে। টার্মনাল বন্ধ করে নতুন সেশন শুরু করলে এই ভ্যারিয়েবল আর খুঁজে পাওয়া যাবে না।

এখন যদি আমরা স্থায়ীভাবে আমাদের এনভায়রনমেন্ট ভ্যারিয়েবল সেট করতে চাই তাহলে, আমাদের .bashrc নামক একটা ফাইলে ভ্যারিয়েবল সেট করতে হবে।

.bashrcফাইল কি?

এই ফাইল হল ইউজারের ব্যক্তিগত স্টার্টার ফাইল। প্রতিবার একজন ইউজার যখন সিস্টেমে লগইন করে অপারেটিং সিস্টেম এই ফাইল থেকে সমস্ত কমান্ড গুলো লোড করে। ইউজারের হোম ডাইরেক্টরিতে এই ফাইল থাকে।

টার্মিনালে ইউজারের হোম ডাইরেক্টরিতে যাওয়ার পর echo "variable_name"="value" >> .bashrc এই কমান্ডটা রান করলে .bashrc এই ফাইলে আমাদের ভ্যারিয়েবল সেট হয়ে যাবে। এখন source ~/.bashrc অথাবা . ~/.bashrc কমান্ড রান করলে ভ্যারিয়েবল অ্যাক্টিভ হবে। source ~/.bashrc , . ~/.bashrc এই কমান্ড দুইটি মূলত .bashrc ফাইলের ভেতর আমরা যে সব পরিবর্তন করছি তা সিস্টেম ওয়াইড অ্যাপ্লাই করার কাজ করে থাকে। প্রকৃত পক্ষে এটি কোনো কমান্ড না, এর মাধ্যমে মূলত .bashrc ফাইল সরাসরি এক্সিকিউট হয়ে থাকে।

User & Group Management

আমরা যখন ডকার দিয়ে লিনাক্সের একটি ইনভারনমেন্ট সেটআপ করেছি তখন, এর ডিফল্ট ইউজার হিসাবে রুট ইউজার (root user) সেটআপ হয়েছে। এই রুট ইউজার (root user) হল অপারেটিং সিস্টেমের মধ্যে সর্বোচ্চ ক্ষমতার অধিকারী। এর অর্থ হল এই রুট ইউজারের সকল সিস্টেম রিসোর্স অ্যাক্সেস করার সক্ষমতা আছে, যা নিরাপত্তা ঝুঁকি তৈরি করতে পারে। এই কারণে সিস্টেমকে রুট ইউজার দিয়ে সচল রাখা রিকমান্ডেড না। তাই আমাদের একটা সাধারণ ইউজারের প্রয়োজন হয়, যার কাছে সকল সিস্টেম রিসোর্স অ্যাক্সেস করার ক্ষমতা থাকে না।

কিভাবে একটা নতুন ইউজার তৈরি করব?

আমাদের কাছে ইউজার ম্যানেজমেন্ট এর জন্য adduser , usermod , userdel এই কমান্ডগুলো আছে। নতুন ইউজার তৈরি করার জন্য আমারা adduser এই কমান্ড ব্যবহার করব। usermod , userdel এই কমান্ড গুলো যথাক্রমে ইউজার মডিফায়িং এবং ইউজার ডিলিট এর কাজে ব্যবহার করা হয়।

আমাদের টার্মিনালে যদি docker run -d --rm --name ubuntuos -v ubuntuvol:/data ubuntu এই কমান্ডটা রান করি তাহলে আমাদের ডকার দিয়ে তৈরি করা লিনাক্স এনভায়রনমেন্ট ব্যাকগ্রাউন্ডে রান হবে।এটা বোঝার জন্য টার্মিনলে docker ps এই কমান্ড রান করলে নিচের মতো আউটপুট দেখতে পাব।

এখন ব্যাকগ্রাউন্ডে চল এই লিনাক্স এনভায়রনমেন্ট এর সাথে আমারা যদি ইন্টারেক্ট করতে চাই তাহলে, টার্মিনালে docker exec -it "CONTAINER ID" এই কমান্ডটা আমাদের কন্টেনার আইডি দিয়ে রান করব।

এখন টার্মিনালে যদি useradd -m user1 কমান্ড রান করি তাহলে আমাদের সিস্টেমে user1 নামে হোম ফোল্ডার home সহ একটা নতুন ইউজার তৈরি হবে। নতুন ইউজার তৈরি হয়েছে কি না তা জানার জন্য টার্মিনালে cat /etc/passwd এই কমান্ড যদি রান করি তাহলে আমরা user1 এর সকল তথ্য দেখতে পাব।

user1:x:1000:1000::/home/user1:/bin/sh এখানে user1 হল ইউজারের নাম, x এটা ইউজারের পাসওয়ার্ড যা /etc/shadow এখানে সংরক্ষণ করা আছে। 1000:1000 এদের মধ্যে প্রথম সংখ্যা ইউজারের আইডি এবং পরের সংখ্যা ইউজারের গ্রুপ আইডি। /home/user1 হল ইউজারের হোম ফোল্ডার এবং /bin/sh ইউজারের শেল প্রোগ্রাম।

আমরা চাইলে এই ইউজার মডিফাই করতে পারি। সেই ক্ষেত্রে আমরা usermod এই কমান্ড ব্যবহার করব। উদাহণ হিসাবে যদি আমরা ইউজারের ডিফল্ট শেল প্রোগ্রাম হিসাবে bash কে সেট করতে চাই তাহলে, টার্মিনলে usermod -s /bin/bash user1 এই কমান্ড রান করব। এখন টার্মিনালে cat /etc/passwd এই কমান্ড রান করলে আমরা পরিবর্তন লক্ষ করব।

আমাদের সিস্টেমে নতুন ইউজার user1 দিয়ে লগইন করতে টার্মিনালে নতুন আরেকটা উইন্ডো ওপেন করতে হবে। সেখানে আমাদের কন্টেনার আইডি ব্যবহার করে docker exec -it -u user1 "CONTAINER ID" bash এই কমান্ড রান করতে হবে। এখানে -u user1 হল আমাদের ইউজারের নাম এবং bash হল আমাদের মডিফাই করা শেল প্রোগ্রাম, যা আমারা এর আগে usermod কমান্ডের সাহায্যে sh থেকে bash এ পরিবর্তন করেছি।

কোনো ইউজার ডিলিট করতে চাইলে userdel "user_name" এই কমান্ড ব্যবহার করব।

ইউজারের গ্রুপ

লিনাক্স সিস্টেমে প্রত্যেকটা ইউজারের একটি প্রাইমারি গ্রুপ থাকে, এটি ইউজার তৈরি করার সময় অটোমেটিক ভাবে ইউজারের নাম দিয়েই তৈরি হয়। সিস্টেমে ইউজার যখন কোনো নতুন ফাইল বা ডাইরেক্টরি তৈরি করে তখন এই প্রিমারি গ্রুপই ডিফল্ট গ্রুপ হিসাবে সেট হয়ে যায়। এর ফলে অপারেটিং সিস্টেম ইউজারের অ্যাকাউন্টের উপর ভিত্তি করে ইউজারের তৈরিকৃত বিভিন্ন ফাইল এবং ফোল্ডার সহজে সনাক্ত করতে পারে।

আমরা যদি ইউজারে ডিফল্ট গ্রুপ দেখতে চাই তাহলে, টার্মিনালে groups "user_name" এই কমান্ড রান করলে প্রথম যে গ্রুপ দেখতে পাব সেটিই ইউজারের প্রাইমারি গ্রুপ।

প্রামারি গ্রুপের পাশাপাশি বিভিন্ন ধরণের সাপ্লিমেন্টারি গ্রুপও দেখা যায়। প্রামারি গ্রুপের বাইরে অন্যান্য গ্রুপের সাথে ফাইল অ্যাক্সেস শেয়ার করার জন্য এই গ্রুপ গুলো ব্যবহার হয়ে থাকে। যেমন - user1 যদি বিভিন্ন ধরণের ফাইলরিলেটেড কাজের জন্য filegroup নামের একটা গ্রুপের সদস্য হয়ে থাকে তাহলে, সে এই গ্রুপের অন্য কোনো সদস্যের মালিকানাধীন বিভিন্ন ফাইল অ্যাকসেস করতে পারবে ফাইলে পারমিশনের উপর ভিত্তি করে।

একটা নতুন গ্রুপ তৈরি করার জন্য টার্মিনালে groupadd "group_name" এই কমান্ড রান করলেই হবে। বিভিন্ন গ্রুপের তথ্য /etc/group এখানে থাকে। আর এই গ্রুপের আন্ডারে কোনো ইউজারকে অ্যাড করতে চাইলে usermod -G "group_name" "user_name" এই কমান্ড রান করব।

File Permissions

অপারেটিং সিস্টেম দক্ষতার সাথে পরিচালনা করতে এবং ডেটার নিরাপত্তা প্রদানের জন্য ফাইল পারমিশন সম্পর্কে জানা অত্যন্ত গুরুত্বপূর্ণ। চলুন তাহলে এই সম্পর্কে বিস্তারিত আলোচলা করা যাক।

আমরা যদি আমাদের রুট ডাইরেক্টরিতে ( / ) ls -l etc | head -10 এই কমান্ডটা রান করি তাহলে, etc এই ফোল্ডারের ভেতরের প্রথম ১০ টি ইলিমেন্টের ডিটেলস ইনফরমেশন দেখতে পাব।

আউটপুটের দিকে খেয়াল করলে দেখতে পাব, ফাইলের ডিটেইল ইনফরমেশন ৭ টি কলামে বিভক্ত।

কলামবর্ণনা
১ম কলামফাইল টাইপ এবং অ্যাকসেস পারমিশন
২য় কলামফাইলের হার্ডলিঙ্কের সংখ্যা
৩য় কলামযে ইউজার ফাইল তৈরি করেছে এবং এর স্বত্বাধিকারী
৪র্থ কলামফাইলের স্বত্বাধিকারী ইউজারের গ্রুপ
৫ম কলামফাইল সাইজ (বাইট)
৬ষ্ঠ কলামশেষ যে সময়ে ফাইল বা ডাইরেক্টরি মডিফাই করা হয়েছে
৭ম কলামফাইল বা ডাইরেক্টরির নাম

১ম কলাম

এই কলামকে আমরা দুই ভাগে ভাগ করতে পারি। যথাঃ ফাইল টাইপ এবং ফাইল মোড।

ফাইল টাইপ

অ্যাট্রিবিউটফাইল টাইপ
-নরমাল ফাইল
dডিরেক্টরি
Iসেম্বলিক লিংক, একে সফট লিংক ও বলা হয়। এটি একটি স্পেশাল ফাইল, যা নিজের ভেতর কোনো ডেটা সংরক্ষণ করে না অন্য ফাইল বা ডাইরেক্টরির পাথ সংরক্ষণ করে। যেমন - বিভিন্ন অ্যাপ্লিকেশনের শর্টকাট তৈরি করা।
cক্যারেক্টার স্পেশাল ফাইল, এই ধরনের ফাইল হার্ডওয়্যার ডিভাইসগুলির একটি ইন্টারফেসকে উপস্থাপন করে। যেমন - টার্মিনাল
bব্লক স্পেশাল ফাইল, এই ধরনের ফাইল এমন ডিভাইসগুলির সাথে ইন্টারঅ্যাক্ট করে যেগুলি ব্লকে ডেটা স্থানান্তর করে। যেমন - হার্ড ড্রাইভ বা ইউএসবি ড্রাইভ।
sলোকাল সকেট ফাইল, এই ফাইল সিস্টেমের ইন্টারনাল প্রসেসের মধ্যে যোগাযোগ স্থাপন এবং নেটওয়ার্ক কোমিউনিকেশনে ব্যবহত হয়ে থাকে।
pনেমড্‌ পাইপ, এই ফাইল বিভিন্ন প্রসেস সমূহের মধ্যে যোগাযোগ স্থাপনের জন্য একটা প্রসেসকে স্ট্রিমে ডেটা রাইট করতে এবং অন্য প্রসেসকে স্ট্রিম থেকে ডেটা রিড করতে সাহয্য করে।

ফাইল মোড/ফাইল পারমিশন

অ্যাট্রিবিউটফাইলডিরেক্টরি
rযে কোনো ফাইল রিড করার পারমিশনডিরেক্টরির বিষয়বস্তু তালিকাভুক্ত করতে দেয়। এর মানে ডিরেক্টরির মধ্যে ফাইল এবং সাবডিরেক্টরি গুলির নাম দেখতে পারা যায়। এর জন্য এক্সিকিউট (x) পারমিশনও দরকার হয়।
wফাইল কে রাইট করার পারমিশনডিরেক্টরির মধ্যে ফাইল তৈরি করা, ডিলিট করা এবং রিনেম করার জন্য এই পারমিশন দরকার। এর জন্য রাইটের (w) পাশাপাশি এক্সিকিউট (x) পারমিশনও দরকার হয়।
xকোনো ফাইল যখন এই পারমিশন সেট করে দেওয়া হয় তখন, ঐ ফাইল একটা এক্সিকিউটেবল প্রোগ্রাম হিসাবে বিবেচিত হয়। যেমন - বিভিন্ন ধনের স্ক্রিপ্টিং ফাইল রান করতে চাইলে এর পারমিশন x করে দিতে হয়।এটি ফাইল সিস্টেম হায়ারার্কি নেভিগেট করতে এবং ডিরেক্টরির মধ্যে ফাইল এবং সাবডিরেক্টরি অ্যাক্সেস করতে অনুমতি প্রদান করে।

আমরা জানি যে, লিনাক্সে ইউজারের প্রামারি গ্রুপের পাশাপাশি বিভিন্ন ধরণের সাপ্লিমেন্টারি গ্রুপও দেখা যায়। যার কারনে ফাইল পারমিশনও তিন স্তরে সেট করতে হয়। উপরের টেবিলের দিকে লক্ষ করলে দেখা যাবে ফাইল পারমিশন ইউজার, গ্রুপ এবং অন্যান্য তে সেট করা আছে। ইউজারের জন্য rw- মানে ইউজার শুধু রিড এবং রাইট করতে পারবে। অপর দিকে rw- সেট করা আছে সেই ইউজারের গ্রুপে এবং r-- আছে শুধু অন্যান্যতে মানে অন্যান্যরা শুধু রিড করতে পারবে।

Change File Mode

ফাইল পারমিশনের ক্ষেত্রে আমরা যদি ইউজারের সিকুয়েন্সের দিকে খেয়াল করি তাহলে, ইউজারের সিকুয়েন্স হবেঃ ইউজার(u) -> গ্রুপ(g) -> অন্যান্য(o) = ugo। আবার পারমিশনের সিকুয়েন্স হবেঃ রিড(r) -> রাইট(w) -> এক্সিকিউট(x) = rwx। অর্থাৎ প্রথম কলামে যে পারমিশন সেট করব তা ইউজারের জন্য, দ্বিতীয় কলামের পারমিশন হবে গ্রুপ এর জন্য এবং তৃতীয় কলামের পারমিশন অন্যন্য এর জন্য।

ফাইল পারমিশন গুলো ব্যবহার করার chmod এই কমান্ডটা ব্যবহার করা হয়। chmod এর মানে হল change mode , এখানে mode হল rwx । এই change mode দুই ভাবে করা যায় - অকটাল নাম্বার রিপ্রেজেন্টশন এবং সিম্বলিক রিপ্রেজেন্টেশন।

অকটাল নাম্বার রিপ্রেজেন্টশনের ক্ষেত্রে r এর ভ্যালু 4 , w এর ভ্যালু 2 এবং x এর ভ্যালু 1 ধরা হয়।

সিম্বলিক রিপ্রেজেন্টেশনঅকটাল নাম্বার রিপ্রেজেন্টশনপারমিশন
- - -- - - = 0Null
- - x- - 1 = 1Execute
- w -- 2 - = 2Write
- w x- 2 1 = 3Write + Execute
r - -4 - - = 4Read
r - x4 - 1 = 5Read + Execute
r w -4 2 - = 6Read + Write
r w x4 2 1 = 7Read + Write + Execute

চলুন একটা উদাহরণের মাধ্যমে এই সম্পর্কে বিস্তারিত আলোচনা করি। শুরুতে আমরা আমাদের হোম ফোল্ডারে test.txt নামের একটা ফাইল তৈরি করব। তারপর এর পারমিশন চেক করব।

এখানে দেখা যাছে যে, ফাইল টাইপের অ্যাট্রিবিউট হল - অর্থাৎ এটি একটি নারমাল ফাইল এবং এর ফাইল মোড/পারমিশন হল rw-r--r--rw-r--r-- এর অকটাল নাম্বারে রিপ্রেজেন্টেশন হল 644 । আমার জানি পারমিশনের ক্ষেত্রে ইউজারের সিকুয়েন্স হলঃ ইউজার(u) -> গ্রুপ(g) -> অন্যান্য(o) = ugo। অর্থাৎ rw-r--r-- এর ক্ষেত্রে rw- বা 42- = 6 হল ইউজারের, r-- বা 4-- = 4 হল গ্রুপের এবং r-- বা 4-- = 4 হল অন্যান্য। সুতরাং ugo এর পারমিশন হল 644

উপরের আলোচনা থেকে আমরা বোঝতে পারলাম যে, chmod এর জন্য আমরা ৩ ডিজিট ব্যবহার করি। যেমন - 644 ইউজারের জন্য read+write , গ্রুপের জন্য read , অন্যান্য এর ক্ষেত্রে read । কিন্তু 644 এর সামনে ডিফল্ট ভাবে 0 দেওয়া থাকে অর্থাৎ, 0644 । এর অর্থ হল - প্রকৃত পক্ষে chmod এর জন্য ৪ ডিজিট ব্যবহার হয়ে থেকে। এখন দেখা যাক 0 এর ক্ষেত্রে আর কী ব্যবহার হতে পারে। এখানে 0 হল স্পেশাল পারমিশন। স্পেশাল পারমিশন গুলো হল - SUID = set uid for user , GUID = setguid for group , SBIT = stickybit for others । এদের অকটাল ভ্যালু যথাক্রমে 4 , 2 এবং 1 । অর্থাৎ 0 এর স্থলে 4 , 2 , 1 অথবা এদের কম্বিনেশন হতে পারে। যেমন - 4644 , 5777 , 3622 ইত্যাদি।

SUID = set uid for user , GUID = setguid for group , SBIT = stickybit for others ইত্যাদি ত বোঝলাম কিন্তু এদের ব্যবহারিক প্রয়োগ কোথায়? ইনশাআল্লাহ্‌ এই সম্পর্কে বিস্তারিত আলোচলা হবে পরবর্তী কোনো আর্টিকেলে।