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
ধরা হয়।
সিম্বলিক রিপ্রেজেন্টেশন | অকটাল নাম্বার রিপ্রেজেন্টশন | পারমিশন |
- - - | - - - = 0 | Null |
- - x | - - 1 = 1 | Execute |
- w - | - 2 - = 2 | Write |
- w x | - 2 1 = 3 | Write + Execute |
r - - | 4 - - = 4 | Read |
r - x | 4 - 1 = 5 | Read + Execute |
r w - | 4 2 - = 6 | Read + Write |
r w x | 4 2 1 = 7 | Read + 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
ইত্যাদি ত বোঝলাম কিন্তু এদের ব্যবহারিক প্রয়োগ কোথায়? ইনশাআল্লাহ্ এই সম্পর্কে বিস্তারিত আলোচলা হবে পরবর্তী কোনো আর্টিকেলে।
Subscribe to my newsletter
Read articles from Faysal Ahammed directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
Faysal Ahammed
Faysal Ahammed
Full-Stack Developer, specializing in JavaScript.