SSD Nodes Learn 🎉 VPS $5.50/ماہ سے
تعلیمی Matt Connorتحریر: Matt Connor

chmod 755 بمقابلہ u+x: numeric اور symbolic mode

chmod میں octal digits اور u/g/o notation کا فرق سمجھیں، recursive numeric mode سے tree کیوں بگڑتا ہے، اور capital X اس مسئلے کو کیسے درست کرتا ہے۔

chmod کیا تبدیل کرتا ہے

chmod فائل یا directory کے permission bits تبدیل کرتا ہے، اور یہ bits دو میں سے کسی ایک notation میں قبول کرتا ہے۔ Numeric form ایک octal number ہوتی ہے جو تمام permission bits کو ایک ہی بار replace کر دیتی ہے۔ Symbolic form user کی class اور operator بیان کرتی ہے، اور صرف ان bits میں ترمیم کرتی ہے جنہیں آپ نامزد کرتے ہیں۔ دونوں کا اختتام ایک ہی system call پر ہوتا ہے۔ فرق ان bits کے ساتھ ہوتا ہے جن کا آپ نے ذکر نہیں کیا۔

Mode پڑھنا اور mode تبدیل کرنا دو الگ کام ہیں۔ اگر long listing میں موجود letters ابھی واضح نہیں ہیں تو پہلے drwxr-xr-x کو ہر field کے لحاظ سے سمجھیں پڑھیں۔ یہ guide صرف انہیں تبدیل کرتی ہے۔

یہاں دی گئی تمام ہدایات اپنے عام login user کے طور پر چلائیں۔ root account ان checks کو bypass کرتا ہے، اس لیے root کے طور پر چلائی گئی permission demonstration سے کچھ ثابت نہیں ہوتا۔ اگر آپ نئے server پر اب بھی root کے طور پر کام کر رہے ہیں تو کم سے کم privileges والا عام user بنائیں اور پھر واپس آئیں۔

ایسا sandbox بنائیں جسے آپ بعد میں حذف کر سکیں

cd "$(mktemp -d)"
touch notes.txt

mktemp -d، /tmp کے اندر ایک خالی directory بناتا ہے اور بنائی گئی directory کا path دکھاتا ہے، جبکہ command substitution اس path کو براہِ راست cd تک پہنچاتی ہے۔ ذیل میں دیا گیا کوئی بھی عمل آپ کی اہم file کو متاثر نہیں کرتا۔

ایک command ہر تبدیلی کا نتیجہ دکھاتی ہے:

stat -c '%a %A %n' notes.txt

%a mode کو octal number کے طور پر دکھاتا ہے، %A اسی mode کو اس حرفی شکل میں دکھاتا ہے جو long listing استعمال کرتی ہے، اور %n نام دکھاتا ہے۔ ذیل کے blocks میں $ سے شروع ہونے والی line وہ ہے جو آپ type کرتے ہیں، اور اس کے نیچے والی line وہ output ہے جو command نے دکھایا۔ انہیں خود چلائیں۔ آپ کی machine پر output ہر line کے لحاظ سے یکساں ہونا چاہیے، کیونکہ numeric mode کا انحصار آپ کے environment کی کسی چیز پر نہیں ہوتا۔

عددی شکل: ہر class کے لیے ایک octal digit

پہلا digit فائل کے owner سے متعلق ہوتا ہے۔ دوسرا فائل کے group سے متعلق ہوتا ہے۔ تیسرا باقی تمام users سے متعلق ہوتا ہے۔ ہر digit اقدار کا مجموعہ ہوتا ہے، یعنی ہر bit کے لیے ایک value۔ ایک وقت میں ایک bit set کریں اور دیکھیں کہ stat کیا report کرتا ہے۔

$ 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

حروف digits کے مطابق ترتیب میں ہوتے ہیں۔ شروع کے file-type character کے بعد پہلے تین حروف owner کے ہوتے ہیں، اگلے تین group کے، اور آخری تین باقی تمام users کے۔ ایک ہی class کے اندر bits کو ملانے کے لیے values جمع کریں۔

$ 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

Numeric mode absolute ہوتا ہے۔ یہ ہر run میں تمام نو bits لکھتا ہے، اس لیے وہ class بھی overwrite ہو جاتی ہے جس کے بارے میں آپ نے سوچا تک نہیں تھا۔

$ 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

دوسری command میں group یا باقی تمام users کے بارے میں کچھ نہیں کہا گیا، پھر بھی ان کے bits تبدیل ہو گئے۔ یہی numeric form کی خصوصیت ہے، اور اسی لیے چھوٹی ترمیم کے لیے numeric form درست tool نہیں ہے۔ (chmod setuid، setgid اور sticky bits کو بھی handle کرتا ہے، جو ان bits سے پہلے چوتھے digit میں ہوتے ہیں۔ یہ الگ موضوع ہے، اور یہ guide تین bits والی form تک محدود ہے۔)

علامتی صورت: class، operator، پھر bits

سب سے پہلے class لکھیں۔ u مالک ہے، g گروپ ہے، o باقی تمام صارفین ہیں، اور a ان سب کو ایک ساتھ ظاہر کرتا ہے۔ اس کے بعد operator لکھیں: + bits شامل کرتا ہے، - bits حذف کرتا ہے، اور = اس class کو صرف ان bits پر set کرتا ہے جو آپ درج کرتے ہیں، جبکہ اس کے باقی تمام bits clear کر دیتا ہے۔ پھر خود bits لکھیں، یعنی 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

ہر command نے صرف ایک class کو تبدیل کیا اور باقی classes کو اسی حالت میں رکھا۔ متعدد clauses کو commas کے ذریعے بغیر spaces کے جوڑیں۔ chmod انہیں بائیں سے دائیں apply کرتا ہے۔

$ 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.txt

برابر کے نشان کے بعد کچھ نہ لکھنے والا go= گروپ اور باقی تمام صارفین سے ہر bit ہٹا دیتا ہے۔ یہ اس file کے لیے مطلوبہ صورت ہے جسے صرف اس کا مالک پڑھ سکتا ہو، مثلاً SSH key pair کا private حصہ۔

chmod اپنے کیے گئے کام کی رپورٹ بھی دے سکتا ہے۔ یہ اس script میں اہم ہے جسے screen پر کوئی monitor نہیں کر رہا ہوتا۔

chmod -v u+x notes.txt
chmod -v u+x notes.txt

-v اسے دی گئی ہر file کے لیے ایک line print کرتا ہے۔ دونوں commands چلائیں اور screen پر موجود دونوں lines کا موازنہ کریں: پہلی line file کا نام، اس کا سابقہ mode، اور تبدیل ہونے کے بعد کا mode دکھاتی ہے؛ دوسری line mode کو retained کے طور پر دکھاتی ہے، کیونکہ جس bit کو add کرنے کی کوشش کی گئی تھی وہ پہلے ہی set تھی۔ -c صرف اس وقت line print کرتا ہے جب file میں واقعی تبدیلی آئے۔ اس لیے log میں رکھنے کے لیے یہ بہتر انتخاب ہے۔

chmod 755 بمقابلہ u+x: کون سا notation استعمال کریں

ایک ہی فائل سے دو مرتبہ آغاز کریں اور موازنہ کریں کہ ہر notation کے بعد کیا باقی رہتا ہے۔

$ 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

دونوں commands نے فائل کو اس کے مالک کے لیے executable بنا دیا۔ صرف ایک command نے باقی دو classes کو جوں کا توں رکھا۔ جب آپ کو مطلوبہ آخری state کا درست علم ہو اور اسے نافذ کرنا ہو تو numeric mode استعمال کریں۔ Deployment script میں یہی درست طریقہ ہے، کیونکہ اس سے ایسی machine پر بھی یکساں نتیجہ پیدا ہوتا ہے جسے آپ نے پہلے نہیں دیکھا۔ جب آپ کے ذہن میں جملہ add یا remove پر مشتمل ہو تو symbolic mode استعمال کریں، کیونکہ numeric form میں یہ کہنے کا کوئی طریقہ نہیں کہ اس حصے کو جوں کا توں رہنے دیں۔

کسی new file کا ابتدائی mode chmod سے حاصل نہیں ہوتا۔ یہ اس process کے umask سے آتا ہے جس نے فائل بنائی ہو۔ اپنے shell میں umask اور umask -S چلائیں تاکہ وہاں نافذ value دیکھ سکیں۔ یہ توقع رکھیں کہ یہ value مختلف distributions، آپ کے login shell اور systemd service، اور مختلف accounts کے درمیان الگ ہو سکتی ہے۔ umask ہر نئی فائل کا mode مقرر کرتا ہے، اس لیے chmod چلنے سے پہلے یہی طے کرتا ہے کہ آپ کس ابتدائی حالت سے شروع کر رہے ہیں۔

ڈائریکٹری پر execute بٹ کیا کرتا ہے

یہ وہ غلط فہمی ہے جس کی وجہ سے سب سے زیادہ وقت ضائع ہوتا ہے۔ عام فائل پر execute بٹ بتاتا ہے کہ kernel اس فائل کو چلا سکتا ہے۔ ڈائریکٹری میں کوئی instructions نہیں ہوتیں، اس لیے اس میں چلانے کے لیے کچھ نہیں ہوتا۔ ڈائریکٹری پر execute بٹ کا مطلب traversal ہے: اس کے اندر موجود نام کو resolve کرنے کی اجازت۔ dir/file تک پہنچنے کے لیے dir پر یہ اجازت درکار ہے۔ read بٹ الگ permission ہے، اور یہ ڈائریکٹری میں موجود ناموں کی فہرست دکھانے کی اجازت دیتا ہے۔ آپ ایک permission دوسری کے بغیر رکھ سکتے ہیں، اور یہ بات اس وقت آسانی سے سمجھ آتی ہے جب آپ اسے عملی طور پر دیکھ چکے ہوں۔

$ mkdir vault
$ printf 'hello\n' > vault/secret.txt
$ chmod 600 vault/secret.txt
$ chmod 100 vault
$ echo vault/*
vault/*
$ cat vault/secret.txt
hello

shell نے pattern کو بغیر تبدیلی کے دوبارہ دکھایا، کیونکہ vault/* کو expand کرنے کے لیے ڈائریکٹری پڑھنا ضروری ہے، اور ایسا glob جس سے کچھ match نہ ہو error پیدا کرنے کے بجائے literal text کے طور پر آگے بھیجا جاتا ہے۔ cat پھر بھی کام کرتا رہا، کیونکہ آپ نے نام خود فراہم کیا تھا اور traversal کی اجازت موجود تھی۔ اب دونوں bits کو آپس میں بدل دیں۔

$ chmod 400 vault
$ echo vault/*
vault/secret.txt
$ cat vault/secret.txt
cat: vault/secret.txt: Permission denied

نام نظر آتے ہیں، لیکن contents نظر نہیں آتے۔ read آپ کو فہرست دیتا ہے۔ execute اندر جانے کا راستہ دیتا ہے۔ تقریباً ہر ڈائریکٹری جسے آپ استعمال کرتے ہیں، دونوں چاہتی ہے۔

$ chmod 500 vault
$ cat vault/secret.txt
hello

عددی mode کے ساتھ chmod -R درخت کو کیوں نقصان پہنچاتا ہے

-R پورے درخت پر چلتا ہے اور جو mode آپ دیتے ہیں، اسے ہر ملنے والی چیز پر لاگو کرتا ہے۔ Directory اور data file کو مختلف bits درکار ہوتے ہیں، اس لیے ایک ہی absolute number دونوں کے لیے درست نہیں ہو سکتا۔ ایک چھوٹا درخت بنائیں اور خرابی کو ہوتے ہوئے دیکھیں۔

$ 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

یہ وہ layout ہے جو static files کی directory کے لیے درکار ہوتا ہے۔ اب پہلی recursive غلطی دیکھیں۔

$ 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

کچھ خراب نہیں ہوا، اور یہی مسئلہ ہے۔ یہ غلطی خاموشی سے ہوتی ہے، اس لیے برسوں تک copy کی گئی ہدایات میں برقرار رہتی ہے۔ اب دو data files خود کو programs ظاہر کر رہی ہیں۔ Git execute bit محفوظ کرتا ہے، اس لیے اگلا commit یہ تبدیلی ہر اس شخص تک پہنچائے گا جو repository clone کرتا ہے، اور rsync اور tar اسے ہر اس machine تک پہنچا دیں گے جہاں آپ یہ tree copy کریں گے۔

دوسری recursive غلطی نمایاں ہوتی ہے۔ کسی directory پر ایسا mode لگائیں جس میں execute bit نہ ہو، تو directory بند ہو جاتی ہے۔

$ 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

Names اب بھی list ہوتے ہیں کیونکہ read bit برقرار رہی، لیکن directory کے ذریعے ہر path بند ہو گیا کیونکہ execute bit موجود نہیں رہی۔ chmod -R 644 site ایک ہی command میں tree کی ہر directory کے ساتھ یہی کرتا ہے۔ بعد میں نتیجہ ہمیشہ یکساں نہیں ہوتا، کیونکہ chmod کو انہی directories سے گزرنا پڑتا ہے جن کی traversal permission وہ ہٹا رہا ہوتا ہے۔ اس لیے یہ فرض کرنے کے بجائے کہ کیا لاگو ہوا ہے، find site -type d -exec stat -c '%a %n' {} + سے اصل نتیجہ check کریں۔ آگے بڑھنے سے پہلے اسے واپس درست کریں۔

$ 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

Recursive chmod کو undo کرنے کا کوئی طریقہ نہیں ہوتا۔ chmod اس بات کا record محفوظ نہیں کرتا کہ اس نے کیا replace کیا، اس لیے repair کی ذمہ داری آپ پر ہوتی ہے؛ modes کو اس بنیاد پر دوبارہ بنانا پڑتا ہے کہ آپ کے خیال میں وہ پہلے کیسے تھے۔ یہ وہی سست اور غیر یقینی کام ہے جو غلطی سے rm -rf کے بعد files دوبارہ بنانا ہوتا ہے۔ سبق بھی وہی ہے: recursive command چلانے سے پہلے اس کے target کو check کریں۔

Capital X: فائلوں پر نہیں، directories پر execute

Symbolic modes میں X کے ساتھ x بھی قبول ہوتا ہے۔ X execute bit صرف وہاں set کرتا ہے جہاں یہ مناسب ہو: کسی directory پر، یا ایسی regular file پر جس میں پہلے ہی کسی class کے لیے execute bit موجود ہو۔ یہی وہ اصول ہے جس پر آپ -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

ایک command کافی تھی۔ Directories traversable رہیں، جبکہ data files میں کوئی تبدیلی نہیں ہوئی۔ Script کا execute bit برقرار رہا کیونکہ اس میں یہ bit پہلے سے موجود تھا۔ یہی X rule کا دوسرا حصہ ہے۔ X اس وقت file کا موجودہ mode پڑھتا ہے، اس لیے جس file کے تمام execute bits پہلے ہی ختم ہو چکے ہوں، 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 کسی file میں پہلے سے موجود execute bit کو کسی دوسری class تک بڑھا سکتا ہے:

$ chmod go+X site/deploy.sh
$ stat -c '%a %A %n' site/deploy.sh
755 -rwxr-xr-x site/deploy.sh

لہذا lowercase x کسی ایک نام زدہ file کو runnable بنانے کے لیے ہے، جبکہ X پوری tree پر کارروائی کرنے کے لیے ہے۔ اگر آپ موجودہ mode پر مبنی rule کے بجائے ہر قسم کی چیز کے لیے exact mode چاہتے ہیں تو walk کو find کے ذریعے تقسیم کریں۔

find site -type d -exec chmod 755 {} +
find site -type f -exec chmod 644 {} +
chmod u+x site/deploy.sh

-type d directories منتخب کرتا ہے اور -type f regular files منتخب کرتا ہے، اس لیے ہر قسم کو مطلوبہ mode ملتا ہے۔ -exec ... + بہت سے paths کو ایک chmod call میں جمع کرتا ہے، بجائے اس کے کہ ہر file کے لیے الگ process شروع کرے۔ ہزاروں entries والی tree میں یہ فرق اہم ہوتا ہے۔ Script کو اس کا bit ایک الگ line پر، جان بوجھ کر، واپس دیا جاتا ہے۔

تبدیلی سے پہلے نتیجہ چیک کریں

دو commands ایسی غلطیاں تلاش کرتی ہیں جو کسی بھی recursive تبدیلی کے بعد اہم ہوتی ہیں۔ پہلی command ان directories کی فہرست دیتی ہے جن میں آپ اب داخل نہیں ہو سکتے۔

find . -type d ! -perm -u+x

دوسری command ان files کی فہرست دیتی ہے جنہیں machine کا کوئی بھی account تبدیل کر سکتا ہے۔

find . -type f -perm -o+w

-perm -o+w میں ابتدائی - کا مطلب ہے کم از کم یہ bits، اس لیے یہ ایسی file سے match کرتا ہے جس کی o class میں write bit موجود ہو، چاہے دیگر bits بھی set ہوں۔ دونوں commands کا کچھ بھی print نہ کرنا مطلوبہ نتیجہ ہے۔ ابھی تبدیل کیے گئے کسی بھی tree کی top directory سے -R کے ساتھ دونوں commands چلائیں، اور ان چند paths پر stat -c '%a %A %n' چلائیں جنہیں آپ نے تبدیل کرنا مقصود تھا، تاکہ آپ کے خیال میں set کیا گیا mode وہی ہو جسے kernel حقیقت میں رکھتا ہے۔

FAQ

chmod 755 اور chmod u+x میں کیا فرق ہے؟

عددی mode مطلق ہوتا ہے۔ یہ فائل پر موجود ہر permission bit لکھ دیتا ہے، اس لیے وہ classes بھی دوبارہ set ہو جاتی ہیں جن کے بارے میں آپ نے نہیں سوچا تھا۔ Symbolic mode میں ترمیم کی جاتی ہے۔ u+x مالک کے لیے ایک bit شامل کرتا ہے اور باقی تمام bits کو جوں کا توں رکھتا ہے۔ جب آپ فائل کی مطلوبہ آخری حالت بالکل جانتے ہوں تو numeric form استعمال کریں۔ جب آپ صرف ایک چیز شامل یا حذف کرنا چاہتے ہوں تو symbolic form استعمال کریں۔ دونوں میں سے کوئی بھی command چلانے سے پہلے اور بعد میں stat -c '%a %A %n' <file> چلائیں۔ فرق output میں نظر آ جائے گا۔

web files والی directory پر chmod -R 755 برا خیال کیوں ہے؟

کیونکہ -R directories اور regular files دونوں پر ایک ہی مطلق mode لگاتا ہے، حالانکہ ان دونوں کو مختلف bits درکار ہوتی ہیں۔ Directory کو traverse کرنے کے لیے execute bit درکار ہوتی ہے۔ HTML اور CSS جیسی data files کو یہ bit درکار نہیں ہوتی، اور انہیں executable نشان زد کرنا وہ تبدیلی ہے جسے git اگلے commit میں record کرتا ہے اور rsync اگلی machine پر copy کرتا ہے۔ chmod -R u=rwX,go=rX <dir> استعمال کریں تاکہ execute bit صرف directories پر لگے، یا find سے اسے -type d اور -type f کے ساتھ چلائیں تاکہ ہر قسم کو اپنا mode ملے۔

directory پر execute bit کیا کرتی ہے؟

یہ execution نہیں بلکہ traversal کی اجازت دیتی ہے۔ Directory کے اندر چلانے کے لیے کوئی چیز موجود نہیں ہوتی۔ Execute bit اس بات کی اجازت ہے کہ اس directory کے اندر موجود name کو resolve کیا جا سکے۔ اس لیے path کے آخر میں موجود file کھولنے سے پہلے path میں شامل ہر directory پر یہ bit درکار ہوتی ہے۔ Read bit الگ ہوتی ہے اور names کی listing کی اجازت دیتی ہے۔ ایک bit دوسری کے بغیر بھی موجود ہو سکتی ہے: صرف execute bit کے ساتھ آپ ایسی file کھول سکتے ہیں جس کا name آپ کو پہلے سے معلوم ہو، لیکن shell اس directory میں glob expand نہیں کر سکتی۔ صرف read bit کے ساتھ آپ names دیکھ سکتے ہیں، لیکن ہر name کھولنے کی کوشش ناکام ہو جاتی ہے۔

lowercase x کے بجائے capital X کب استعمال کرنا چاہیے؟

جب command recursive ہو تو X استعمال کریں۔ X directories پر execute bit set کرتا ہے، اور regular files پر صرف اس وقت جب پہلے ہی کوئی execute bit set ہو۔ اس طرح ایک ہی pass میں tree traversable ہو جاتی ہے، لیکن data files programs میں تبدیل نہیں ہوتیں۔ جب آپ ایک file کو براہ راست target کر رہے ہوں اور اسی file پر عمل کرنا مقصود ہو تو lowercase x استعمال کریں۔ ایک حد یاد رکھیں: X ایسی execute bit بحال نہیں کر سکتا جو file پر ہر جگہ پہلے ہی clear ہو چکی ہو، کیونکہ match کرنے کے لیے کوئی bit باقی نہیں رہتی۔ وہ bit chmod u+x <file> سے دوبارہ شامل کریں۔

کیا chmod فائل کے مالک کو تبدیل کرتا ہے؟

نہیں۔ chmod صرف permission bits تبدیل کرتا ہے۔ Ownership میں user کے لیے chown اور group کے لیے chgrp ذمہ دار ہوتے ہیں، جبکہ فائل کسی دوسرے user کو دینے کے لیے root درکار ہوتا ہے۔ یہ اس لیے اہم ہے کہ bits فائل پر درج owner اور group کے مطابق پڑھی جاتی ہیں، نہ کہ اس user کے مطابق جس نے آخری بار فائل لکھی ہو۔ فیصلہ کرنے سے پہلے کہ آپ کو ان تین commands میں سے کون سی درکار ہے، stat -c '%U %G %a %n' <file> چلائیں۔ اس سے owner، group اور mode ایک ساتھ نظر آ جائیں گے۔