লিনাক্স ফাইল পারমিশন: chmod, chown ও sudo উদাহরণসহ
লিনাক্সে ফাইলের অধিকার তিনটি rwx সেট দিয়ে নির্ধারিত — মালিক, গ্রুপ ও অন্যদের জন্য; chmod দিয়ে তা বদলানো যায় প্রতীকী রূপে (chmod u+x) বা সংখ্যায় (chmod 755, যেখানে r=4, w=2, x=1)। মালিক বদলায় chown, আর প্রশাসনিক কাজ চলে sudo দিয়ে; Permission denied ত্রুটির অর্থ প্রায় সব সময় হলো ফাইল বা পাথের কোনো ডিরেক্টরিতে আপনার প্রয়োজনীয় অধিকার নেই।
লিনাক্সে ফাইলের পারমিশন ঠিক করে "কে ফাইলটির সঙ্গে কী করতে পারবে"। প্রতিটি ফাইলের একজন মালিক, একটি গ্রুপ এবং তিনটি অধিকার-সেট আছে: মালিকের জন্য, গ্রুপের জন্য এবং বাকি সবার জন্য। অধিকার বদলায় chmod, মালিক বদলায় chown, আর প্রশাসনিক কাজ চলে sudo দিয়ে। চলুন দেখি কীভাবে অধিকার পড়তে হয়, বদলাতে হয় এবং Permission denied ত্রুটি সারাতে হয়।
ফাইলের পারমিশন কীভাবে দেখবেন
পারমিশন দেখা যায় ls -l-এর আউটপুটে:
$ ls -l
-rw-r--r-- 1 alice developers 1204 Oct 10 14:02 notes.txt
-rwxr-xr-x 1 alice developers 356 Oct 10 14:05 deploy.sh
drwxr-x--- 2 alice developers 4096 Oct 10 13:50 secrets
প্রথম দশটি অক্ষর এভাবে পড়তে হয়:
- প্রথম অক্ষর — ধরন:
-সাধারণ ফাইল,dডিরেক্টরি,lসিম্বলিক লিংক। - ২–৪ নম্বর অক্ষর — মালিকের (user) পারমিশন।
- ৫–৭ নম্বর অক্ষর — গ্রুপের (group) পারমিশন।
- ৮–১০ নম্বর অক্ষর — অন্যদের (others) পারমিশন।
এরপর থাকে হার্ড লিংকের সংখ্যা, মালিক (alice), গ্রুপ (developers), আকার, তারিখ ও নাম। একটি ফাইলের জন্য stat কমান্ড সুবিধাজনক:
$ stat -c '%A %a %U:%G %n' deploy.sh
-rwxr-xr-x 755 alice:developers deploy.sh
r, w ও x-এর অর্থ
ফাইল ও ডিরেক্টরির জন্য অধিকারের অর্থ আলাদা — এখানেই সবচেয়ে বেশি বিভ্রান্তি হয়।
| অধিকার | ফাইলের জন্য | ডিরেক্টরির জন্য |
|---|---|---|
r (read) | কন্টেন্ট পড়া | ফাইলের নামের তালিকা দেখা (ls) |
w (write) | কন্টেন্ট বদলানো | ভেতরে ফাইল তৈরি, মোছা ও নাম বদলানো |
x (execute) | প্রোগ্রাম হিসেবে চালানো | ডিরেক্টরিতে ঢোকা (cd) ও পাথ দিয়ে ফাইল অ্যাক্সেস |
খেয়াল রাখুন: ডিরেক্টরিতে w ও x থাকলে কেউ ফাইল মুছতে পারে, এমনকি ফাইলটিতে লিখতে না পারলেও। আর ডিরেক্টরিতে x না থাকলে ভেতরের ফাইল খোলা যায় না, ফাইলের r অধিকার থাকলেও।
সিস্টেম ক্রমানুসারে পারমিশন যাচাই করে: আপনি মালিক হলে মালিকের অধিকার প্রযোজ্য; তা না হলে এবং গ্রুপের সদস্য হলে গ্রুপের অধিকার; তা-ও না হলে অন্যদের অধিকার। root ব্যবহারকারী পড়া ও লেখার যাচাই এড়িয়ে যায়।
সংখ্যার রূপ: 755, 644, 600
প্রতিটি অধিকারের ওজন আছে: r = 4, w = 2, x = 1। ওজনের যোগফল তিনটি সেটের প্রতিটির জন্য ০ থেকে ৭ পর্যন্ত একটি অঙ্ক দেয়।
| অঙ্ক | অধিকার | হিসাব |
|---|---|---|
| 7 | rwx | 4+2+1 |
| 6 | rw- | 4+2 |
| 5 | r-x | 4+1 |
| 4 | r-- | 4 |
| 0 | --- | 0 |
যে সাধারণ সংমিশ্রণগুলো মুখস্থ রাখা উচিত:
| মোড | রূপ | কোথায় ব্যবহৃত |
|---|---|---|
644 | rw-r--r-- | সাধারণ ফাইল, কনফিগ, HTML |
755 | rwxr-xr-x | ডিরেক্টরি, স্ক্রিপ্ট ও প্রোগ্রাম |
600 | rw------- | ব্যক্তিগত SSH কী, পাসওয়ার্ডযুক্ত ফাইল |
700 | rwx------ | ~/.ssh ডিরেক্টরি, ব্যক্তিগত ডিরেক্টরি |
640 | rw-r----- | সার্ভিসের গ্রুপ যে কনফিগ পড়ে |
777 | rwxrwxrwx | সবাই সব কিছু করতে পারবে — প্রায় কখনোই দরকার হয় না |
chmod কমান্ড: অধিকার বদলানো
সংখ্যা মোড
সংখ্যা মোড পুরো অধিকার একসঙ্গে ঠিক করে:
chmod 644 index.html
chmod 755 deploy.sh
chmod 600 ~/.ssh/id_ed25519
প্রতীকী মোড
প্রতীকী রূপে নির্দিষ্ট অধিকার বদলানো যায়, অন্যগুলো অপরিবর্তিত রেখে। কার জন্য: u মালিক, g গ্রুপ, o অন্যরা, a সবাই। কাজ: + যোগ, - বাদ, = ঠিক এই মান সেট।
chmod +x deploy.sh # চালানোর অনুমতি
chmod u+x,g-w file # মালিক চালাতে পারবে, গ্রুপ লিখতে পারবে না
chmod o-rwx secrets/ # অন্যরা কিছুই পাবে না
chmod g=rx app/ # গ্রুপ শুধু পড়বে ও ঢুকবে
রিকার্সিভলি: ফাইল ও ডিরেক্টরিকে আলাদাভাবে
-R অপশন পুরো ট্রিতে অধিকার প্রয়োগ করে। কিন্তু chmod -R 755 সব ফাইলকে চালানোযোগ্য করে ফেলে, যা সাধারণত কাম্য নয়। তাই find দিয়ে ফাইল ও ডিরেক্টরি আলাদা করা ভালো:
find /srv/site -type d -exec chmod 755 {} +
find /srv/site -type f -exec chmod 644 {} +
একটি সংক্ষিপ্ত উপায়ও আছে: বড় X শুধু সেইসব ডিরেক্টরি ও ফাইলে চালানোর অধিকার যোগ করে, যাদের আগে থেকেই তা আছে।
chmod -R u=rwX,go=rX /srv/site
chown কমান্ড: মালিক ও গ্রুপ বদলানো
ফাইলের মালিক বদলাতে পারে শুধু root, তাই chown প্রায় সব সময় sudo দিয়ে চালানো হয়।
sudo chown alice report.txt # মালিক
sudo chown alice:developers report.txt # মালিক ও গ্রুপ
sudo chown :www-data index.html # শুধু গ্রুপ
sudo chown -R www-data:www-data /var/www/site
শুধু গ্রুপ বদলাতে আলাদা কমান্ড আছে: sudo chgrp developers report.txt। নিজের গ্রুপগুলো দেখা যায় id বা groups দিয়ে।
$ id
uid=1000(alice) gid=1000(alice) groups=1000(alice),27(sudo),1001(developers)
কোনো ব্যবহারকারীকে গ্রুপে যুক্ত করতে sudo usermod -aG developers bob। -a অপশন অপরিহার্য: এটি না থাকলে ব্যবহারকারী বাকি সব অতিরিক্ত গ্রুপ থেকে বাদ পড়বে। নতুন গ্রুপ কার্যকর হয় পুনরায় লগইন করার পর।
sudo: প্রশাসক হিসেবে কাজ
sudo একটি কমান্ড root (বা অন্য ব্যবহারকারী) হিসেবে চালায় এবং root-এর পাসওয়ার্ড নয়, আপনার নিজের পাসওয়ার্ড চায়। প্রতিটি আহ্বান লগে লেখা থাকে, তাই বোঝা যায় কে কী করেছে।
sudo apt update
sudo systemctl restart nginx
sudo -u postgres psql # postgres ব্যবহারকারী হিসেবে
sudo -i # ইন্টারেক্টিভ root শেল
sudo -l # আমাকে কী কী করার অনুমতি দেওয়া আছে
কে কী করতে পারবে তা লেখা থাকে /etc/sudoers এবং /etc/sudoers.d/ ডিরেক্টরির ফাইলে। এই ফাইলগুলো শুধু sudo visudo দিয়ে সম্পাদনা করুন: এটি সিনট্যাক্স যাচাই করে, তাই ফাইলে ভুল থাকলে আপনি sudo থেকে বাদ পড়বেন না। Ubuntu-তে sudo গ্রুপের সদস্যতা দিয়ে প্রশাসনিক অধিকার দেওয়া হয়, RHEL-ভিত্তিক সিস্টেমে wheel গ্রুপ দিয়ে।
# /etc/sudoers.d/deploy — deploy ব্যবহারকারী শুধু nginx রিস্টার্ট করতে পারবে
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx
কেন sudo echo > file কাজ করে না
একটি সাধারণ ফাঁদ:
$ sudo echo "127.0.0.1 test.local" >> /etc/hosts
bash: /etc/hosts: Permission denied
>> রিডাইরেকশন করে আপনার শেল, sudo নয়, তাই ফাইলটি root অধিকার ছাড়া খোলা হয়। সঠিক উপায় tee দিয়ে:
echo "127.0.0.1 test.local" | sudo tee -a /etc/hosts
Permission denied: কারণ ও সমাধান
Permission denied মানে কার্নেল আপনার প্রসেসের কাজটি প্রত্যাখ্যান করেছে। বিশ্লেষণের ধাপ সব সময় এক: আমি কে (id), মালিক কে ও অধিকার কী (ls -l), এবং পাথের প্রতিটি ডিরেক্টরির অধিকার কী (namei -l)।
$ namei -l /srv/app/config/app.env
f: /srv/app/config/app.env
drwxr-xr-x root root /
drwxr-xr-x root root srv
drwxr-x--- deploy deploy app
drwxr-xr-x deploy deploy config
-rw-r----- deploy deploy app.env
এখানে দেখা যাচ্ছে app ডিরেক্টরি অন্যদের জন্য বন্ধ — deploy গ্রুপের বাইরের ব্যবহারকারী ফাইলটির অধিকার যা-ই হোক, এর বেশি যেতে পারবে না।
স্ক্রিপ্ট চলছে না
$ ./deploy.sh
bash: ./deploy.sh: Permission denied
ফাইলে চালানোর অধিকার নেই। সমাধান chmod +x deploy.sh, অথবা ইন্টারপ্রেটারের মাধ্যমে চালানো: bash deploy.sh। যদি পার্টিশন noexec অপশনে মাউন্ট করা থাকে (প্রায়ই /tmp-এ হয়), তাহলে ফাইল সরাসরি চালানো যাবে না, শুধু দ্বিতীয় উপায়টি কাজ করবে।
সিস্টেম ডিরেক্টরিতে লেখা যাচ্ছে না
/etc, /usr ও /var/www-এর ফাইল সাধারণত root বা সার্ভিস ব্যবহারকারীর মালিকানায় থাকে। এক-বারের পরিবর্তনে sudo ব্যবহার করুন, আর নিয়মিত কাজের জন্য সবাইকে নয়, একটি গ্রুপকে অধিকার দিন।
ওয়েব সার্ভার 403 দিচ্ছে
Nginx বা Apache চলে www-data ব্যবহারকারী হিসেবে (Debian ও Ubuntu-তে)। তার ফাইল পড়ার অধিকার এবং পাথের সব ডিরেক্টরিতে x প্রয়োজন। সমাধান: sudo chown -R www-data:www-data /var/www/site, অথবা ডিরেক্টরিতে 755 এবং ফাইলে 644।
SSH কী গ্রহণ করছে না
SSH খুব উন্মুক্ত অধিকারের কী ব্যবহার করতে অস্বীকার করে। ব্যক্তিগত কী-এর অধিকার 600 হতে হবে, ~/.ssh ডিরেক্টরি 700, আর সার্ভারের authorized_keys ফাইল 600।
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519 ~/.ssh/authorized_keys
Docker-এ অ্যাক্সেস নেই
permission denied while trying to connect to the Docker daemon socket মানে আপনি docker গ্রুপে নেই। sudo usermod -aG docker $USER চালিয়ে আবার লগইন করুন। মনে রাখবেন, এই গ্রুপের সদস্যতা কার্যত root অধিকারের সমান।
কেন chmod 777 খারাপ ধারণা
"শুধু chmod 777 দিন" বললে ত্রুটি চলে যায়, কিন্তু ফাইলটি সিস্টেমের প্রতিটি ব্যবহারকারী ও প্রসেসের জন্য লেখা যোগ্য হয়ে যায়। ওয়েব অ্যাপ্লিকেশন হ্যাক হলে আক্রমণকারী এই ফাইলগুলো বদলে দিতে পারে। সঠিক পথ: কোন ব্যবহারকারীর অ্যাক্সেস দরকার তা খুঁজে বের করা, এবং মালিক বা গ্রুপের মাধ্যমে সেই ব্যবহারকারীকেই অধিকার দেওয়া।
umask: ডিফল্ট অধিকার
নতুন ফাইল তৈরি হয় umask দ্বারা কমানো অধিকার নিয়ে। সাধারণ মান 022 হলে ফাইল তৈরি হয় 644 অধিকার নিয়ে, ডিরেক্টরি 755 নিয়ে।
$ umask
0022
সংক্ষেপে
লিনাক্স পারমিশন মানে মালিক, গ্রুপ ও অন্যদের জন্য তিনটি rwx সেট। chmod সংখ্যায় (755, 644, 600) বা প্রতীকে অধিকার বদলায়, chown মালিক বদলায়, আর sudo একটি কমান্ড root হিসেবে চালায়। Permission denied দেখলে ব্যবহারকারী, ফাইলের অধিকার এবং পাথের প্রতিটি ডিরেক্টরির অধিকার যাচাই করুন, আর 777 দিয়ে সমস্যা লুকাবেন না। ব্যবহারকারী, গ্রুপ, অধিকার ও sudo লিনাক্স কোর্সে বিস্তারিত ও হাতে-কলমে শেখানো হয়।
সাধারণ প্রশ্ন
chmod 755 মানে কী?
মালিক পড়তে, লিখতে ও চালাতে পারবে (7); গ্রুপ ও অন্যরা পড়তে ও চালাতে পারবে (5)। ডিরেক্টরি ও স্ক্রিপ্টের জন্য এটি সাধারণ সংমিশ্রণ।
chmod ও chown-এর পার্থক্য কী?
chmod অধিকার বদলায় (ফাইল দিয়ে কী করা যাবে), আর chown মালিক ও গ্রুপ বদলায় (অধিকারগুলো কার)।
কোনো ব্যবহারকারীকে কীভাবে sudo অধিকার দেব?
Ubuntu ও Debian-এ sudo usermod -aG sudo নাম দিয়ে sudo গ্রুপে যুক্ত করুন; RHEL-ভিত্তিক সিস্টেমে wheel গ্রুপে। পুনরায় লগইন করার পর পরিবর্তন কার্যকর হবে।
4755 অধিকার ও SUID বিট কী?
প্রথম অঙ্ক 4 SUID চালু করে: প্রোগ্রাম চলে ফাইলের মালিকের অধিকার নিয়ে, চালানো ব্যবহারকারীর নয়। passwd এর উদাহরণ; ls-এর আউটপুটে মালিকের x-এর জায়গায় s দেখা যায়।
root কেন 000 অধিকারের ফাইলও পড়তে পারে?
কার্নেল root-এর সাধারণ পড়া ও লেখার অধিকার যাচাই করে না। root-কে সীমিত করতে হলে অন্য ব্যবস্থা লাগে, যেমন SELinux, AppArmor, বা chattr +i।
“Linux: с нуля до уверенного администрирования” কোর্সে বিষয়টি অনুশীলনসহ বিস্তারিত শেখানো হয়েছে।
কোর্সে যান