SSD Nodes Learn 🎉 VPS $5.50/महिन्यापासून
मार्गदर्शक Matt Connorद्वारे Matt Connor

chmod 755 आणि u+x मधील फरक काय आहे?

Linux मध्ये chmod वापरताना numeric आणि symbolic पद्धतीमधील फरक समजून घ्या. 755 आणि u+x चे नेमके परिणाम, recursive मोडमधील धोके आणि capital X चा वापर कसा करावा हे जाणून घ्या.

chmod काय बदलते

chmod फाईल किंवा डिरेक्टरीवरील परमिशन बिट्स बदलते आणि ते दोनपैकी एका नोटेशनमध्ये हे बिट्स स्वीकारते. न्यूमेरिक फॉरमॅटमध्ये एक ऑक्टल नंबर वापरला जातो, जो सर्व परमिशन बिट्स एकाच वेळी बदलतो. सिम्बॉलिक फॉरमॅटमध्ये युजरचा प्रकार आणि ऑपरेटर वापरून फक्त तुम्ही नमूद केलेले बिट्स बदलले जातात. दोन्ही पद्धती शेवटी एकाच सिस्टिम कॉलवर संपतात. फरक फक्त इतकाच आहे की, ज्या बिट्सचा तुम्ही उल्लेख करत नाही, त्यांचे काय होते.

मोड वाचणे आणि मोड बदलणे ही दोन वेगळी कामे आहेत. जर लाँग लिस्टिंगमधील अक्षरे तुम्हाला अजून स्पष्ट नसतील, तर आधी drwxr-xr-x चा अर्थ प्रत्येक फील्डनुसार काय आहे हे वाचा. हे मार्गदर्शक फक्त ते बदलण्यावर लक्ष केंद्रित करते.

येथील सर्व कमांड्स तुमच्या सामान्य लॉगिन युजरने चालवा. root अकाउंट या तपासण्यांना बायपास करते, त्यामुळे root म्हणून केलेले परमिशनचे प्रात्यक्षिक काहीही सिद्ध करत नाही. जर तुम्ही अजूनही नवीन सर्व्हरवर root म्हणून काम करत असाल, तर कमीतकमी अधिकारांचा एक सामान्य युजर तयार करा आणि मग परत या.

अशी सँडबॉक्स तयार करा जी तुम्ही नंतर काढून टाकू शकता

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

mktemp -d हे /tmp अंतर्गत एक रिकामी डिरेक्टरी तयार करते आणि तयार केलेल्या पाथची (path) प्रिंट काढते, आणि कमांड सबस्टिट्यूशन तो पाथ थेट cd कडे पाठवते. खालीलपैकी कोणतीही गोष्ट तुमच्या महत्त्वाच्या फाईलला स्पर्श करत नाही.

एक कमांड प्रत्येक बदलाचा निकाल देते:

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

%a मोडला ऑक्टल नंबर म्हणून प्रिंट करते, %A तोच मोड लाँग लिस्टिंगमध्ये वापरल्या जाणाऱ्या अक्षरी स्वरूपात प्रिंट करते आणि %n नावाचे प्रिंटिंग करते. खालील ब्लॉक्समध्ये, $ ने सुरू होणारी ओळ तुम्ही टाईप करायची आहे आणि त्याखालील ओळ कमांडने प्रिंट केलेली माहिती आहे. त्या स्वतः चालवून पहा. तुमच्या मशीनवरील आउटपुट ओळीनुसार जुळले पाहिजे, कारण न्यूमरिक मोड तुमच्या एन्व्हायरनमेंटमधील कोणत्याही गोष्टीवर अवलंबून नसतो.

संख्यात्मक स्वरूप: प्रत्येक वर्गासाठी एक अष्टमान (octal) अंक

पहिला अंक फाईलच्या मालकासाठी असतो. दुसरा अंक फाईलच्या ग्रुपसाठी असतो. तिसरा अंक इतर सर्वांसाठी असतो. प्रत्येक अंक हा बेरजेचा परिणाम असतो, जिथे प्रत्येक बिटसाठी एक मूल्य असते. एका वेळी एक बिट सेट करा आणि 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

संख्यात्मक मोड (numeric mode) हा पूर्ण असतो. तो प्रत्येक वेळी नऊही बिट्स लिहितो, त्यामुळे ज्या वर्गाचा तुम्ही विचारही केला नसेल, तो देखील लिहिला जातो.

$ 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 हे setuid, setgid आणि sticky bits देखील हाताळते, जे या तीन अंकांच्या आधी चौथ्या अंकात असतात. तो एक वेगळा विषय आहे आणि हे मार्गदर्शक फक्त तीन अंकांवरच लक्ष केंद्रित करते.)

सांकेतिक स्वरूप: एक क्लास, एक ऑपरेटर आणि त्यानंतर बिट्स

प्रथम क्लास लिहा. 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

प्रत्येक कमांडने एका क्लासवर प्रक्रिया केली आणि इतरांना त्यांच्या मूळ स्थितीत ठेवले. क्लॉजना स्वल्पविरामाने (comma) जोडा आणि मध्ये स्पेस देऊ नका; 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.txt

go= च्या बरोबर चिन्हाच्या पुढे काहीही न दिल्यास, ते ग्रुप आणि इतर सर्वांकडून सर्व बिट्स काढून घेते. ज्या फाईलला फक्त मालकानेच वाचले पाहिजे, जसे की 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

दोन्ही कमांड्समुळे फाईल मालकासाठी (owner) एक्झिक्युटेबल झाली. मात्र, केवळ एकाच कमांडने इतर दोन वर्गांच्या (group आणि others) परवानग्या जशा होत्या तशा ठेवल्या. जेव्हा तुम्हाला फाईलची नेमकी अंतिम स्थिती काय असावी हे माहित असते आणि ती सक्तीने लागू करायची असते, तेव्हा numeric mode वापरा. डिप्लॉयमेंट स्क्रिप्टमध्ये हे आवश्यक असते, कारण तिथे तुम्हाला खात्री हवी असते की तुम्ही कधीही न पाहिलेल्या मशीनवरही निकाल सारखाच मिळेल. जेव्हा तुमच्या मनात add (मिळवणे) किंवा remove (काढून टाकणे) असे शब्द येतात, तेव्हा symbolic mode वापरा, कारण numeric पद्धतीत 'इतर भागांना धक्का न लावता बदल करा' असे सांगता येत नाही.

एखादी नवीन फाईल कोणत्या मोडमध्ये तयार होईल, हे chmod ठरवत नाही. ते फाईल तयार करणाऱ्या प्रोसेसच्या umask वरून ठरते. तुमच्या शेलमध्ये umask आणि umask -S चालवून सध्या लागू असलेले मूल्य तपासा. हे मूल्य वेगवेगळ्या डिस्ट्रिब्युशन्समध्ये, तुमच्या लॉगिन शेल आणि systemd सर्व्हिसमध्ये, तसेच एका अकाउंटकडून दुसऱ्या अकाउंटकडे बदलू शकते. umask प्रत्येक नवीन फाईलचा मोड ठरवते, त्यामुळे chmod चालवण्यापूर्वी फाईलची सुरुवातीची स्थिती काय असेल, हे यावरूनच निश्चित होते.

डिरेक्टरीवर execute बिट काय काम करतो

हा असा गैरसमज आहे ज्यामध्ये सर्वाधिक वेळ वाया जातो. सामान्य फाईलवर, execute बिटचा अर्थ असा होतो की कर्नल ती फाईल चालवू (run) शकते. डिरेक्टरीमध्ये कोणतीही सूचना (instructions) नसल्यामुळे, तिथे चालवण्यासारखे काहीही नसते. डिरेक्टरीच्या बाबतीत execute बिटचा अर्थ 'traversal' (प्रवेश) असा होतो: म्हणजेच त्या डिरेक्टरीमधील नावाचे रिझोल्यूशन (resolve) करण्याची परवानगी. dir/file पर्यंत पोहोचण्यासाठी तुम्हाला dir वर ही परवानगी असणे आवश्यक आहे. read बिट ही एक स्वतंत्र परवानगी आहे, जी डिरेक्टरीमध्ये असलेली नावे पाहण्याची (list) मुभा देते. तुम्ही यापैकी एक परवानगी दुसऱ्याशिवाय ठेवू शकता, आणि एकदा तुम्ही हे प्रत्यक्षात घडताना पाहिले की हे समजणे सोपे जाते.

$ 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/* एक्सपँड करणे म्हणजे डिरेक्टरी वाचणे होय, आणि काहीही मॅच न करणारा glob एरर देण्याऐवजी जसाच्या तसा (literal text) पुढे पाठवला जातो. cat तरीही काम करत होते कारण तुम्ही स्वतः नाव दिले होते आणि तिथे प्रवेश (traversal) करण्याची परवानगी होती. आता हे दोन्ही बिट्स एकमेकांशी बदलून पहा.

$ 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

chmod -R सह अंकीय मोड वापरल्याने फाइल ट्रीचे नुकसान का होते

-R संपूर्ण ट्रीमध्ये फिरते आणि तुम्ही दिलेला मोड प्रत्येक फाइल किंवा डिरेक्टरीला लागू करते. डिरेक्टरी आणि डेटा फाइलसाठी वेगवेगळ्या परवानग्या (bits) आवश्यक असतात, त्यामुळे एकच अंकीय मोड दोन्हीसाठी योग्य असू शकत नाही. एक लहान ट्री तयार करून काय चूक होते ते पहा.

$ 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

स्टॅटिक फाइल्सच्या डिरेक्टरीसाठी ही रचना योग्य आहे. येथे पहिली रिकर्सिव्ह चूक दिली आहे.

$ 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 द्वारे तुम्ही जिथे जिथे ही ट्री कॉपी करता, तिथे हा बदल पोहोचतो.

दुसरी रिकर्सिव्ह चूक स्पष्टपणे जाणवते. जर तुम्ही एक्झिक्युट बिट नसलेला मोड डिरेक्टरीला लावला, तर ती डिरेक्टरी बंद होते.

$ 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: फाईल्सऐवजी डिरेक्टरीजवर एक्झिक्युट (execute) परमिशन लागू करणे

सिम्बॉलिक मोड्समध्ये 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 हे संपूर्ण ट्री (tree) वर प्रक्रिया करण्यासाठी आहे. जेव्हा तुम्हाला सध्याच्या मोडवर आधारित नियमाऐवजी प्रत्येक प्रकारच्या गोष्टीसाठी अचूक मोड हवा असेल, तेव्हा 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 कॉलमध्ये एकत्रित करते, ज्यामुळे प्रत्येक फाईलसाठी स्वतंत्र प्रोसेस सुरू करावी लागत नाही; हजारो एन्ट्रीज असलेल्या ट्रीवर हे महत्त्वाचे ठरते. स्क्रिप्टला तिचे बिट एका स्वतंत्र ओळीवर, जाणीवपूर्वक परत दिले जाते.

निघण्यापूर्वी निकालाची खात्री करा

कोणत्याही रिकर्सिव्ह बदलांनंतर महत्त्वाच्या चुका शोधण्यासाठी दोन कमांड्स वापरल्या जातात. पहिली कमांड अशा डिरेक्टरीजची यादी देते ज्या तुम्ही आता उघडू शकत नाही.

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

दुसरी कमांड अशा फाइल्सची यादी देते ज्या मशीनवरील कोणतेही खाते संपादित करू शकते.

find . -type f -perm -o+w

-perm -o+w मध्ये, सुरुवातीचा - याचा अर्थ किमान हे बिट्स असा होतो, त्यामुळे हे अशा फाइलशी जुळते ज्याच्या o क्लासमध्ये राइट बिट सेट आहे, मग इतर कोणतेही बिट सेट असो वा नसो. दोन्ही कमांड्सनी काहीही आउटपुट न देणे हे अपेक्षित परिणाम आहे. तुम्ही -R सह ज्या ट्रीमध्ये बदल केले आहेत, त्या सर्वांच्या वरून या दोन्ही कमांड्स चालवा. तसेच, ज्या पाथ्समध्ये बदल करण्याचा तुमचा हेतू होता, त्यावर stat -c '%a %A %n' चालवा, जेणेकरून तुम्ही सेट केलेला मोड आणि कर्नलने प्रत्यक्षात ठेवलेला मोड एकच असल्याची खात्री होईल.

FAQ

chmod 755 आणि chmod u+x मध्ये काय फरक आहे?

न्यूमेरिक मोड हा पूर्ण (absolute) असतो. तो फाईलवरील प्रत्येक परमिशन बिट लिहून काढतो, त्यामुळे ज्या क्लासेसचा तुम्ही विचार केला नसेल ते सुद्धा बदलले जातात. सिम्बॉलिक मोड हा एक बदल (edit) आहे. u+x मालकासाठी एक बिट जोडते आणि इतर सर्व बिट्स जसे आहेत तसेच ठेवते. जेव्हा तुम्हाला फाईलची नेमकी अंतिम स्थिती काय हवी आहे हे माहित असते, तेव्हा न्यूमेरिक फॉर्म वापरा. जेव्हा तुम्हाला एखादी गोष्ट जोडायची किंवा काढायची असते, तेव्हा सिम्बॉलिक फॉर्म वापरा. दोन्ही कमांड्सच्या आधी आणि नंतर stat -c '%a %A %n' <file> चालवा, म्हणजे आउटपुटमध्ये तुम्हाला फरक दिसून येईल.

वेब फाईल्सच्या डिरेक्टरीवर chmod -R 755 वापरणे चुकीचे का आहे?

कारण -R डिरेक्टरी आणि रेग्युलर फाईल्स या दोन्हीवर समान ॲब्सोल्युट मोड लागू करते, आणि या दोघांना वेगवेगळ्या बिट्सची गरज असते. डिरेक्टरीमधून प्रवास (traversal) करण्यासाठी एक्झिक्युट बिटची गरज असते. HTML आणि CSS सारख्या डेटा फाईल्सना त्याची गरज नसते, आणि त्यांना एक्झिक्युटेबल म्हणून मार्क केल्यास git ते बदल तुमच्या पुढच्या कमिटमध्ये नोंदवते आणि rsync ते पुढच्या मशीनवर कॉपी करते. chmod -R u=rwX,go=rX <dir> वापरा जेणेकरून एक्झिक्युट बिट फक्त डिरेक्टरीवरच लागू होईल, किंवा find सह -type d आणि -type f वापरून प्रत्येक प्रकारच्या फाईलला तिचा योग्य मोड द्या.

डिरेक्टरीवर एक्झिक्युट बिट काय काम करते?

ते प्रवासाची (traversal) परवानगी देते, एक्झिक्युशनची नाही. डिरेक्टरीमध्ये रन करण्यासारखे काहीही नसते. एक्झिक्युट बिट म्हणजे त्यातील नावाचे रिझोल्यूशन करण्याची परवानगी, त्यामुळे मार्गाच्या शेवटी असलेली फाईल उघडण्यापूर्वी तुम्हाला त्या मार्गावरील प्रत्येक डिरेक्टरीवर हे बिट असणे आवश्यक असते. रीड बिट वेगळे असते आणि ते नावे पाहण्याची (listing) परवानगी देते. तुम्ही एक बिट दुसऱ्याशिवाय ठेवू शकता: फक्त एक्झिक्युट बिट असल्यास तुम्ही माहित असलेली फाईल उघडू शकता, पण शेल त्या डिरेक्टरीमधील ग्लोब (glob) विस्तारू शकत नाही; आणि फक्त रीड बिट असल्यास तुम्ही नावे पाहू शकता, पण फाईल उघडण्याचा प्रत्येक प्रयत्न अयशस्वी होतो.

मी स्मॉल x ऐवजी कॅपिटल X कधी वापरावा?

जेव्हा कमांड रिकर्सिव्ह असते तेव्हा X वापरा. X डिरेक्टरीवर एक्झिक्युट बिट सेट करते, आणि रेग्युलर फाईल्सवर तेव्हाच सेट करते जेव्हा आधीच एक एक्झिक्युट बिट सेट असेल. यामुळे डेटा फाईल्सना प्रोग्राममध्ये न बदलता संपूर्ण ट्री ट्रॅव्हर्स करण्यायोग्य बनते. जेव्हा तुम्ही एका विशिष्ट फाईलवर काम करत असता तेव्हा स्मॉल x वापरा. एक मर्यादा लक्षात ठेवण्यासारखी आहे: X फाईलवरून पूर्णपणे काढलेले एक्झिक्युट बिट पुन्हा रिस्टोअर करू शकत नाही, कारण मॅच करण्यासाठी तिथे काहीही उरलेले नसते. अशा वेळी chmod u+x <file> वापरून ते पुन्हा सेट करा.

chmod फाईलचा मालक बदलते का?

नाही. chmod फक्त परमिशन बिट्स बदलते. मालकी हक्क chown (युजरसाठी) आणि chgrp (ग्रुपसाठी) यांच्याकडे असतात आणि फाईल दुसऱ्या युजरला हस्तांतरित करण्यासाठी root ची गरज असते. हे महत्त्वाचे आहे कारण बिट्स फाईलवर नोंदवलेल्या मालक आणि ग्रुपच्या आधारावर वाचले जातात, फाईल कोणी लिहिली यावर नाही. मालक, ग्रुप आणि मोड एकत्र पाहण्यासाठी stat -c '%U %G %a %n' <file> चालवा, त्यानंतरच तुम्हाला या तीनपैकी कोणत्या कमांडची खरोखर गरज आहे हे ठरवा.