chmod 755 বনাম u+x: পারমিশন পরিবর্তনের সঠিক নিয়ম
Linux-এ chmod কমান্ডের অক্টাল ও সিম্বলিক মোডের পার্থক্য জানুন। কেন রিকার্সিভ মোড ডিরেক্টরি নষ্ট করে এবং ক্যাপিটাল X ব্যবহার করে কীভাবে ফাইল ও ফোল্ডারের পারমিশন ঠিক করবেন তা শিখুন।
chmod কী পরিবর্তন করে
chmod একটি ফাইল বা ডিরেক্টরির পারমিশন বিট পরিবর্তন করে এবং এটি দুটি নোটেশনের যেকোনো একটি গ্রহণ করে। সংখ্যাসূচক (numeric) ফরম্যাটটি একটি অক্টাল নম্বর, যা একবারে সব পারমিশন বিট প্রতিস্থাপন করে। সিম্বলিক (symbolic) ফরম্যাটটি ব্যবহারকারীর শ্রেণি এবং একটি অপারেটরের নাম উল্লেখ করে, যা শুধুমাত্র আপনার নির্দিষ্ট করা বিটগুলোই পরিবর্তন করে। উভয়ই শেষ পর্যন্ত একই সিস্টেম কলে গিয়ে পৌঁছায়। পার্থক্য হলো, আপনি যে বিটগুলো উল্লেখ করেননি, সেগুলোর ক্ষেত্রে কী ঘটে।
একটি মোড পড়া এবং একটি মোড পরিবর্তন করা দুটি ভিন্ন কাজ। যদি লং লিস্টিং-এর অক্ষরগুলো আপনার কাছে এখনো স্পষ্ট না হয়, তবে প্রথমে drwxr-xr-x এর প্রতিটি ফিল্ডের অর্থ কী তা পড়ুন। এই নির্দেশিকাটি শুধুমাত্র সেগুলো পরিবর্তন করার জন্য।
এখানে সবকিছু আপনার সাধারণ লগইন ইউজার হিসেবে চালান। root অ্যাকাউন্ট এই চেকগুলোকে এড়িয়ে যায়, তাই root হিসেবে চালানো পারমিশন ডেমোনস্ট্রেশন কোনো কিছু প্রমাণ করে না। আপনি যদি এখনো নতুন সার্ভারে root হিসেবে কাজ করে থাকেন, তবে ন্যূনতম প্রিভিলেজসহ একটি সাধারণ ইউজার তৈরি করুন এবং তারপর ফিরে আসুন।
একটি স্যান্ডবক্স সেট আপ করুন যা আপনি মুছে ফেলতে পারেন
cd "$(mktemp -d)"
touch notes.txtmktemp -d, /tmp-এর অধীনে একটি খালি ডিরেক্টরি তৈরি করে এবং তৈরি করা পাথটি প্রিন্ট করে, এবং কমান্ড সাবস্টিটিউশন সেই পাথটিকে সরাসরি cd-এ পাঠিয়ে দেয়। এর নিচের কোনো কিছুই আপনার প্রয়োজনীয় কোনো ফাইল স্পর্শ করবে না।
একটি কমান্ড প্রতিটি পরিবর্তনের ফলাফল রিপোর্ট করে:
stat -c '%a %A %n' notes.txt%a মোডটিকে অক্টাল সংখ্যা হিসেবে প্রিন্ট করে, %A একই মোডকে লং লিস্টিংয়ে ব্যবহৃত অক্ষর আকারে প্রিন্ট করে, এবং %n নামটিকে প্রিন্ট করে। নিচের ব্লকগুলোতে, $ দিয়ে শুরু হওয়া লাইনটি হলো যা আপনি টাইপ করবেন, এবং এর নিচের লাইনটি হলো যা কমান্ডটি প্রিন্ট করেছে। এগুলো নিজে চালিয়ে দেখুন। আপনার মেশিনে আউটপুট লাইন অনুযায়ী হুবহু মিল থাকা উচিত, কারণ একটি নিউমেরিক মোড আপনার এনভায়রনমেন্টের কোনো কিছুর ওপর নির্ভর করে না।
সংখ্যাসূচক বিন্যাস: প্রতি ক্লাসের জন্য একটি অক্টাল ডিজিট
প্রথম ডিজিটটি ফাইলের মালিকের জন্য। দ্বিতীয়টি ফাইলের গ্রুপের জন্য। তৃতীয়টি অন্য সবার জন্য। প্রতিটি ডিজিট হলো একটি যোগফল, যেখানে প্রতিটি বিটের জন্য একটি মান থাকে। একবারে একটি বিট সেট করুন এবং দেখুন stat কী রিপোর্ট করে।
$ chmod 400 notes.txt
$ stat -c '%a %A %n' notes.txt
400 -r-------- notes.txt
$ chmod 200 notes.txt
$ stat -c '%a %A %n' notes.txt
200 --w------- notes.txt
$ chmod 100 notes.txt
$ stat -c '%a %A %n' notes.txt
100 ---x------ notes.txtঅক্ষরগুলো ডিজিটের সাথে সামঞ্জস্যপূর্ণ। ফাইলের ধরন নির্দেশকারী প্রথম অক্ষরের পর, প্রথম তিনটি অক্ষরের গ্রুপটি মালিকের, পরের তিনটি গ্রুপের এবং শেষ তিনটি অন্য সবার। একটি ক্লাসের ভেতরের বিটগুলো একত্রিত করতে মানগুলো যোগ করুন।
$ chmod 600 notes.txt
$ stat -c '%a %A %n' notes.txt
600 -rw------- notes.txt
$ chmod 700 notes.txt
$ stat -c '%a %A %n' notes.txt
700 -rwx------ notes.txt
$ chmod 750 notes.txt
$ stat -c '%a %A %n' notes.txt
750 -rwxr-x--- notes.txtএকটি সংখ্যাসূচক মোড হলো অ্যাবসোলিউট। এটি প্রতিবার চালানোর সময় নয়টি বিটই লিখে ফেলে, তাই যে ক্লাসটি সম্পর্কে আপনি ভাবেননি সেটিও পরিবর্তিত হয়ে যায়।
$ chmod 755 notes.txt
$ stat -c '%a %A %n' notes.txt
755 -rwxr-xr-x notes.txt
$ chmod 600 notes.txt
$ stat -c '%a %A %n' notes.txt
600 -rw------- notes.txtদ্বিতীয় কমান্ডটিতে গ্রুপ বা অন্য সবার সম্পর্কে কিছুই বলা হয়নি, তবুও তাদের বিটগুলো পরিবর্তিত হয়েছে। এটিই সংখ্যাসূচক বিন্যাসের বৈশিষ্ট্য, এবং ছোটখাটো পরিবর্তনের জন্য এটি ভুল টুল। (chmod সেটইউআইডি, সেটজিআইডি এবং স্টিকি বিটগুলোও হ্যান্ডেল করে, যা এদের আগে চতুর্থ একটি ডিজিটে থাকে। সেটি একটি আলাদা বিষয়, এবং এই নির্দেশিকাটি কেবল তিনটি ডিজিট নিয়েই আলোচনা করে।)
প্রতীকী রূপ: একটি ক্লাস, একটি অপারেটর, তারপর বিটগুলো
প্রথমে ক্লাসটি লিখুন। u হলো মালিক, g হলো গ্রুপ, o হলো অন্য সবাই এবং a হলো তাদের সবাই একসাথে। এরপর অপারেটর: + বিট যোগ করে, - বিট মুছে ফেলে এবং = সেই ক্লাসটিকে ঠিক আপনার তালিকাভুক্ত বিটগুলোতে সেট করে এবং বাকি বিটগুলো মুছে ফেলে। এরপর বিটগুলো নিজে, যেমন r, w অথবা x।
$ chmod 640 notes.txt
$ stat -c '%a %A %n' notes.txt
640 -rw-r----- notes.txt
$ chmod u+x notes.txt
$ stat -c '%a %A %n' notes.txt
740 -rwxr----- notes.txt
$ chmod g-r notes.txt
$ stat -c '%a %A %n' notes.txt
700 -rwx------ notes.txt
$ chmod o=r notes.txt
$ stat -c '%a %A %n' notes.txt
704 -rwx---r-- notes.txtপ্রতিটি কমান্ড একটি ক্লাসকে পরিবর্তন করে এবং বাকিগুলোকে অপরিবর্তিত রাখে। কমা দিয়ে ক্লজগুলো যুক্ত করুন এবং কোনো স্পেস দেবেন না, chmod এগুলোকে বাম থেকে ডানে প্রয়োগ করে।
$ chmod u=rw,go=r notes.txt
$ stat -c '%a %A %n' notes.txt
644 -rw-r--r-- notes.txt
$ chmod go= notes.txt
$ stat -c '%a %A %n' notes.txt
600 -rw------- notes.txtgo= এবং সমান চিহ্নের পরে কিছু না থাকলে তা গ্রুপ এবং অন্য সবার কাছ থেকে সব বিট সরিয়ে নেয়। কোনো ফাইলের ক্ষেত্রে এটিই সেই রূপ যা আপনি চান যদি কেবল মালিকই সেটি পড়তে পারে, যেমন একটি SSH key pair-এর ব্যক্তিগত অংশ।
chmod তার নিজের কাজের রিপোর্টও দিতে পারে, যা এমন স্ক্রিপ্টের ক্ষেত্রে গুরুত্বপূর্ণ যেখানে কেউ স্ক্রিন দেখছে না।
chmod -v u+x notes.txt
chmod -v u+x notes.txt-v প্রতিটি ফাইলের জন্য একটি লাইন প্রিন্ট করে। দুটি কমান্ডই চালান এবং আপনার স্ক্রিনে দুটি লাইন তুলনা করুন: প্রথমটি ফাইলের নাম এবং মোড পরিবর্তনের আগের ও পরের অবস্থা জানায়, আর দ্বিতীয়টি মোড অপরিবর্তিত থাকার রিপোর্ট দেয়, কারণ যে বিটটি যোগ করতে বলা হয়েছিল তা আগেই সেট করা ছিল। -c কেবল তখনই একটি লাইন প্রিন্ট করে যখন কোনো ফাইল প্রকৃতপক্ষে পরিবর্তিত হয়, তাই লগে রাখার জন্য এটিই উত্তম।
chmod 755 বনাম u+x: কোন নোটেশনটি ব্যবহার করবেন
একই ফাইল থেকে শুরু করুন এবং প্রতিটি নোটেশন কী পরিবর্তন করে তা তুলনা করুন।
$ chmod 640 notes.txt
$ chmod 755 notes.txt
$ stat -c '%a %A %n' notes.txt
755 -rwxr-xr-x notes.txt
$ chmod 640 notes.txt
$ chmod u+x notes.txt
$ stat -c '%a %A %n' notes.txt
740 -rwxr----- notes.txtউভয় কমান্ডই ফাইলটিকে এর মালিকের জন্য executable করে তুলেছে। শুধুমাত্র একটি কমান্ড অন্য দুটি শ্রেণির (group এবং others) অনুমতি অপরিবর্তিত রেখেছে। যখন আপনি চূড়ান্ত অবস্থা সম্পর্কে নিশ্চিত থাকেন এবং সেটি বলবৎ করতে চান, তখন numeric mode ব্যবহার করুন। এটি এমন deployment script-এর জন্য উপযুক্ত যা এমন একটি মেশিনে একই ফলাফল তৈরি করবে যা আপনি আগে কখনো দেখেননি। যখন আপনার মনে add বা remove করার চিন্তা থাকে, তখন symbolic mode ব্যবহার করুন, কারণ numeric ফর্মে কোনো অংশ অপরিবর্তিত রাখার সুযোগ নেই।
একটি new ফাইলের প্রাথমিক mode chmod থেকে আসে না। এটি ফাইলটি তৈরি করা প্রসেসের umask থেকে আসে। আপনার শেল-এ বর্তমানে কার্যকর মান দেখতে umask এবং umask -S চালান। মনে রাখবেন, এই মানটি বিভিন্ন ডিস্ট্রিবিউশন, আপনার লগইন শেল ও systemd service, এবং বিভিন্ন অ্যাকাউন্টের মধ্যে ভিন্ন হতে পারে। umask প্রতিটি নতুন ফাইলের mode নির্ধারণ করে, তাই chmod চালানোর আগে আপনি কী অবস্থা থেকে শুরু করছেন তা এটিই ঠিক করে দেয়।
ডিরেক্টরিতে execute বিট যা করে
এটি এমন একটি ভুল ধারণা যা সবচেয়ে বেশি সময় নষ্ট করে। সাধারণ ফাইলের ক্ষেত্রে, execute বিট নির্দেশ করে যে কার্নেল ফাইলটি চালাতে পারে। ডিরেক্টরিতে কোনো নির্দেশনা থাকে না, তাই সেখানে চালানোর মতো কিছু নেই। ডিরেক্টরির ক্ষেত্রে execute বিট মানে হলো ট্রাভার্সাল বা পরিভ্রমণ: এর ভেতরে থাকা কোনো নামের লোকেশন খুঁজে পাওয়ার অনুমতি। dir/file-এ পৌঁছাতে হলে আপনাকে অবশ্যই dir-এ এই অনুমতি পেতে হবে। রিড (read) বিট একটি আলাদা অনুমতি, যা ডিরেক্টরিতে থাকা নামগুলোর তালিকা দেখার সুযোগ দেয়। আপনি একটি ছাড়াই অন্যটি রাখতে পারেন, যা বাস্তবে প্রয়োগ করে দেখলে বোঝা সহজ।
$ mkdir vault
$ printf 'hello\n' > vault/secret.txt
$ chmod 600 vault/secret.txt
$ chmod 100 vault
$ echo vault/*
vault/*
$ cat vault/secret.txt
helloশেল প্যাটার্নটিকে অপরিবর্তিত অবস্থায় প্রিন্ট করেছে কারণ vault/* এক্সপ্যান্ড করার অর্থ হলো ডিরেক্টরি পড়া, এবং যে গ্লোব কোনো কিছুর সাথে মেলে না তা কোনো এরর না দেখিয়ে আক্ষরিক টেক্সট হিসেবে পাস হয়ে যায়। cat তখনও কাজ করেছে কারণ আপনি নিজেই নামটি সরবরাহ করেছিলেন এবং ট্রাভার্সালের অনুমতি ছিল। এখন বিট দুটি অদলবদল করুন।
$ chmod 400 vault
$ echo vault/*
vault/secret.txt
$ cat vault/secret.txt
cat: vault/secret.txt: Permission deniedনামগুলো দৃশ্যমান কিন্তু ভেতরের বিষয়বস্তু নয়। রিড (read) আপনাকে তালিকা দেয়। এক্সিকিউট (execute) আপনাকে ভেতরে ঢোকার পথ দেয়। আপনি যে ডিরেক্টরিগুলো ব্যবহার করেন তার প্রায় সবগুলোর জন্যই উভয় অনুমতি প্রয়োজন।
$ chmod 500 vault
$ cat vault/secret.txt
helloকেন numeric mode ব্যবহার করে chmod -R করলে ডিরেক্টরি ট্রি ক্ষতিগ্রস্ত হয়
-R পুরো ডিরেক্টরি ট্রি জুড়ে ঘুরে বেড়ায় এবং আপনার দেওয়া mode প্রতিটি ফাইলের ওপর প্রয়োগ করে। একটি ডিরেক্টরি এবং একটি ডেটা ফাইলের জন্য ভিন্ন ভিন্ন বিট প্রয়োজন, তাই একটি নির্দিষ্ট সংখ্যা উভয় ক্ষেত্রেই সঠিক হতে পারে না। একটি ছোট ডিরেক্টরি ট্রি তৈরি করে দেখুন কীভাবে এটি ভুলভাবে কাজ করে।
$ mkdir -p site/css
$ touch site/index.html site/css/main.css
$ printf '#!/bin/bash\necho hi\n' > site/deploy.sh
$ chmod 755 site site/css site/deploy.sh
$ chmod 644 site/index.html site/css/main.css
$ stat -c '%a %A %n' site site/css site/index.html site/css/main.css site/deploy.sh
755 drwxr-xr-x site
755 drwxr-xr-x site/css
644 -rw-r--r-- site/index.html
644 -rw-r--r-- site/css/main.css
755 -rwxr-xr-x site/deploy.shস্থির ফাইলের (static files) ডিরেক্টরির জন্য এটিই সঠিক বিন্যাস। নিচে প্রথম রিকার্সিভ ভুলের উদাহরণ দেওয়া হলো।
$ chmod -R 755 site
$ stat -c '%a %A %n' site/index.html site/css/main.css
755 -rwxr-xr-x site/index.html
755 -rwxr-xr-x site/css/main.cssএতে কোনো কিছু ভেঙে যায়নি, আর এটাই মূল সমস্যা। এই ভুলটি নীরবে ঘটে, তাই বছরের পর বছর ধরে কপি করা নির্দেশাবলীতে এটি টিকে থাকে। এখন দুটি ডেটা ফাইল নিজেকে প্রোগ্রাম হিসেবে দাবি করছে। Git এক্সিকিউট বিট সংরক্ষণ করে, তাই আপনার পরবর্তী কমিটে এই পরিবর্তনটি সেই সবার কাছে পৌঁছে যাবে যারা রিপোজিটরি ক্লোন করবে, এবং rsync ও tar এর মাধ্যমে আপনি যেখানেই এই ট্রি কপি করবেন, সেখানেই এই সমস্যাটি ছড়িয়ে পড়বে।
দ্বিতীয় রিকার্সিভ ভুলটি বেশ প্রকট। কোনো ডিরেক্টরির ওপর এক্সিকিউট বিট ছাড়া কোনো mode প্রয়োগ করলে ডিরেক্টরিটি বন্ধ হয়ে যায়।
$ chmod 644 site
$ stat -c '%a %A %n' site
644 drw-r--r-- site
$ echo site/*
site/css site/deploy.sh site/index.html
$ cd site
bash: cd: site: Permission denied
$ cat site/index.html
cat: site/index.html: Permission deniedডিরেক্টরির নামগুলো এখনো দেখা যাচ্ছে কারণ রিড বিটটি টিকে আছে, কিন্তু ডিরেক্টরির ভেতর দিয়ে যাওয়ার প্রতিটি পথ বন্ধ হয়ে গেছে কারণ এক্সিকিউট বিটটি মুছে গেছে। chmod -R 644 site একটি কমান্ডের মাধ্যমে ট্রি-এর প্রতিটি ডিরেক্টরির সাথে এমনটিই করে। এর পরে আপনি যা পাবেন তা সবসময় একই রকম নাও হতে পারে, কারণ chmod-কে সেই ডিরেক্টরিগুলোর ভেতর দিয়েই যেতে হয় যেগুলোর ট্রাভার্সাল বা চলাচলের অনুমতি সে নিজেই কেড়ে নিচ্ছে। তাই অনুমান না করে find site -type d -exec stat -c '%a %n' {} + দিয়ে যাচাই করুন আসলে কী ঘটেছে। এগিয়ে যাওয়ার আগে এটি ঠিক করে নিন।
$ chmod 755 site
$ chmod 644 site/index.html site/css/main.css
$ stat -c '%a %A %n' site site/index.html
755 drwxr-xr-x site
644 -rw-r--r-- site/index.htmlরিকার্সিভ chmod-এর কোনো undo বা পূর্বাবস্থায় ফেরার উপায় নেই। chmod কী পরিবর্তন করেছে তার কোনো রেকর্ড রাখে না, তাই আপনাকে নিজেই আগের মোডগুলো মনে করে সেগুলো পুনরায় ঠিক করতে হবে। এটি অনেকটা দুর্ঘটনাবশত rm -rf করার পর ফাইল পুনরুদ্ধারের মতো ধীর এবং অনিশ্চিত কাজ। এর শিক্ষাটি সহজ: রিকার্সিভ কমান্ড চালানোর আগে এন্টার চাপার আগে লক্ষ্যবস্তু যাচাই করে নিন।
ক্যাপিটাল X: প্রতিটি ফাইলে নয়, শুধুমাত্র ডিরেক্টরিতে এক্সিকিউট পারমিশন প্রয়োগ
সিম্বলিক মোড X-এর পাশাপাশি x-ও গ্রহণ করে। X শুধুমাত্র সেখানেই এক্সিকিউট বিট সেট করে যেখানে এটি যুক্তিযুক্ত: কোনো ডিরেক্টরিতে, অথবা এমন কোনো সাধারণ ফাইলে যাতে ইতিমধ্যে কোনো ক্লাসের জন্য এক্সিকিউট বিট রয়েছে। এই নিয়মটি ঠিক সেই নিয়ম যা আপনি -R-এর ক্ষেত্রে চেয়েছিলেন।
$ chmod -R u=rwX,go=rX site
$ stat -c '%a %A %n' site site/css site/index.html site/css/main.css site/deploy.sh
755 drwxr-xr-x site
755 drwxr-xr-x site/css
644 -rw-r--r-- site/index.html
644 -rw-r--r-- site/css/main.css
755 -rwxr-xr-x site/deploy.shএকটি কমান্ডের মাধ্যমেই ডিরেক্টরিগুলো ট্রাভার্সযোগ্য (traversable) থাকল, কিন্তু ডেটা ফাইলগুলো অপরিবর্তিত রইল। স্ক্রিপ্টটি তার এক্সিকিউট বিট ধরে রাখল কারণ সেটিতে আগে থেকেই একটি বিট ছিল, যা X নিয়মের দ্বিতীয় অংশ। X বর্তমান ফাইলের মোড পড়ে নেয়, তাই যে ফাইলের সব এক্সিকিউট বিট আগেই হারিয়ে গেছে, সেটিকে এর মাধ্যমে ফিরিয়ে আনা সম্ভব নয়।
$ chmod 644 site/deploy.sh
$ chmod -R u=rwX,go=rX site
$ stat -c '%a %A %n' site/deploy.sh
644 -rw-r--r-- site/deploy.sh
$ site/deploy.sh
bash: site/deploy.sh: Permission denied
$ chmod u+x site/deploy.sh
$ stat -c '%a %A %n' site/deploy.sh
744 -rwxr--r-- site/deploy.sh
$ site/deploy.sh
hiএকই নিয়ম বিপরীতভাবেও কাজ করে। X কোনো ফাইলের বিদ্যমান এক্সিকিউট বিটকে অন্য ক্লাসের জন্য প্রসারিত করবে:
$ chmod go+X site/deploy.sh
$ stat -c '%a %A %n' site/deploy.sh
755 -rwxr-xr-x site/deploy.shসুতরাং ছোট হাতের x নির্দিষ্ট একটি ফাইলকে রানযোগ্য করার জন্য, আর X পুরো ডিরেক্টরি ট্রিতে প্রয়োগ করার জন্য। যখন বর্তমান মোডের ওপর ভিত্তি করে কোনো নিয়ম না চেয়ে প্রতিটি ধরনের ফাইলের জন্য সুনির্দিষ্ট মোড চান, তখন find ব্যবহার করে কাজটিকে আলাদা করুন।
find site -type d -exec chmod 755 {} +
find site -type f -exec chmod 644 {} +
chmod u+x site/deploy.sh-type d ডিরেক্টরি নির্বাচন করে এবং -type f সাধারণ ফাইল নির্বাচন করে, ফলে প্রতিটি ধরন তার প্রাপ্য মোড পায়। -exec ... + প্রতিটি ফাইলের জন্য আলাদা প্রসেস শুরু না করে অনেকগুলো পাথকে একটি chmod কলের মধ্যে নিয়ে আসে, যা হাজার হাজার এন্ট্রি থাকা ডিরেক্টরি ট্রির ক্ষেত্রে গুরুত্বপূর্ণ। স্ক্রিপ্টটি তার বিট ফিরে পায় একটি আলাদা লাইনের মাধ্যমে, যা ইচ্ছাকৃতভাবেই করা হয়েছে।
Check the result before you walk away
Two commands find the mistakes that matter after any recursive change. The first lists directories you can no longer walk into.
find . -type d ! -perm -u+xThe second lists files that any account on the machine may edit.
find . -type f -perm -o+wIn -perm -o+w, the leading - means at least these bits, so it matches a file whose o class holds the write bit whatever else is set. Neither command printing anything is the result you want. Run both from the top of any tree you have just changed with -R, and run stat -c '%a %A %n' on the handful of paths you meant to change, so the mode you believe you set is the mode the kernel actually holds.
FAQ
chmod 755 এবং chmod u+x এর মধ্যে পার্থক্য কী?
একটি নিউমেরিক মোড হলো অ্যাবসোলিউট বা পরম। এটি ফাইলের প্রতিটি পারমিশন বিট লিখে দেয়, তাই আপনি যে ক্লাসগুলো নিয়ে ভাবেননি সেগুলোও নতুন করে লেখা হয়ে যায়। একটি সিম্বলিক মোড হলো একটি এডিট বা পরিবর্তন। u+x শুধুমাত্র মালিকের জন্য একটি বিট যোগ করে এবং অন্য সব বিট আগের মতোই রেখে দেয়। যখন আপনি জানেন যে একটি ফাইলের ঠিক কী চূড়ান্ত অবস্থা প্রয়োজন, তখন নিউমেরিক ফরম্যাট ব্যবহার করুন। যখন আপনি একটি নির্দিষ্ট বিষয় যোগ বা বিয়োগ করতে চান, তখন সিম্বলিক ফরম্যাট ব্যবহার করুন। যেকোনো কমান্ড চালানোর আগে এবং পরে stat -c '%a %A %n' <file> রান করুন, তাহলে আউটপুটে পার্থক্যটি দেখতে পাবেন।
ওয়েব ফাইলের ডিরেক্টরিতে chmod -R 755 চালানো কেন খারাপ আইডিয়া?
কারণ -R ডিরেক্টরি এবং সাধারণ ফাইল—উভয়ের ক্ষেত্রেই একই অ্যাবসোলিউট মোড প্রয়োগ করে, অথচ এই দুটির জন্য আলাদা বিট প্রয়োজন। একটি ডিরেক্টরিকে ট্রাভার্স বা প্রবেশযোগ্য করার জন্য এক্সিকিউট বিট প্রয়োজন। HTML এবং CSS-এর মতো ডেটা ফাইলের জন্য এটি প্রয়োজন নেই, এবং সেগুলোকে এক্সিকিউটেবল হিসেবে চিহ্নিত করলে git আপনার পরবর্তী কমিটে সেই পরিবর্তন রেকর্ড করবে এবং rsync পরবর্তী মেশিনে তা কপি করবে। chmod -R u=rwX,go=rX <dir> ব্যবহার করুন যাতে এক্সিকিউট বিট শুধুমাত্র ডিরেক্টরিতেই প্রয়োগ হয়, অথবা -type d এবং -type f এর সাথে find ব্যবহার করুন যাতে প্রতিটি ধরনের ফাইলের জন্য আলাদা মোড সেট করা যায়।
ডিরেক্টরিতে এক্সিকিউট বিট কী কাজ করে?
এটি ট্রাভার্সাল বা চলাচলের অনুমতি দেয়, এক্সিকিউশনের নয়। ডিরেক্টরির ভেতরে চালানোর মতো কিছু থাকে না। এক্সিকিউট বিট হলো ডিরেক্টরির ভেতরের কোনো ফাইলের নাম রেজলভ করার অনুমতি, তাই কোনো ফাইলের পাথ ওপেন করার আগে সেই পাথের প্রতিটি ডিরেক্টরিতে আপনার এই বিটটি থাকা প্রয়োজন। রিড বিট আলাদা এবং এটি ফাইলের নাম তালিকাভুক্ত করার অনুমতি দেয়। আপনি একটি ছাড়া অন্যটি রাখতে পারেন: শুধুমাত্র এক্সিকিউট বিট থাকলে আপনি এমন ফাইল ওপেন করতে পারবেন যার নাম আপনি আগে থেকেই জানেন, যদিও শেল সেই ডিরেক্টরিতে কোনো গ্লোব (glob) এক্সপ্যান্ড করতে পারবে না; আবার শুধুমাত্র রিড বিট থাকলে আপনি নামগুলো দেখতে পাবেন, কিন্তু ফাইল ওপেন করার প্রতিটি প্রচেষ্টা ব্যর্থ হবে।
ছোট হাতের x এর পরিবর্তে বড় হাতের X কখন ব্যবহার করব?
যখন কমান্ডটি রিকার্সিভ বা পুনরাবৃত্তিমূলক হয়, তখন X ব্যবহার করুন। X ডিরেক্টরির ক্ষেত্রে এক্সিকিউট বিট সেট করে, আর সাধারণ ফাইলের ক্ষেত্রে শুধুমাত্র তখনই সেট করে যদি আগে থেকেই কোনো একটি এক্সিকিউট বিট সেট করা থাকে। ফলে একটি মাত্র পাসের মাধ্যমেই ডেটা ফাইলগুলোকে প্রোগ্রামে পরিণত না করে পুরো ট্রি-কে ট্রাভার্সযোগ্য করা যায়। যখন আপনি একটি নির্দিষ্ট ফাইলের দিকে নির্দেশ করছেন এবং শুধুমাত্র সেই ফাইলটির কথাই বোঝাচ্ছেন, তখন ছোট হাতের x ব্যবহার করুন। একটি সীমাবদ্ধতা মনে রাখা জরুরি: X এমন কোনো এক্সিকিউট বিট পুনরুদ্ধার করতে পারে না যা আগে থেকেই ফাইলের সব জায়গা থেকে মুছে ফেলা হয়েছে, কারণ তখন মেলানোর মতো আর কিছু অবশিষ্ট থাকে না। সেক্ষেত্রে chmod u+x <file> ব্যবহার করে সেটি ফিরিয়ে আনুন।
chmod কি ফাইলের মালিকানা পরিবর্তন করে?
না। chmod শুধুমাত্র পারমিশন বিট পরিবর্তন করে। মালিকানা থাকে chown (ইউজার) এবং chgrp (গ্রুপ)-এর অধীনে, এবং অন্য কোনো ইউজারের কাছে ফাইল হস্তান্তর করতে root-এর প্রয়োজন হয়। এটি গুরুত্বপূর্ণ কারণ বিটগুলো ফাইলের সাথে রেকর্ড করা মালিক এবং গ্রুপের সাপেক্ষে পড়া হয়, ফাইলটি সর্বশেষ কে লিখেছে তার সাপেক্ষে নয়। আপনি কোন কমান্ডটি ব্যবহার করবেন তা সিদ্ধান্ত নেওয়ার আগে মালিক, গ্রুপ এবং মোড একসাথে দেখতে stat -c '%U %G %a %n' <file> রান করুন।