chmod 755 மற்றும் u+x: கோப்பு அனுமதிகளை மாற்றுவது எப்படி?
Linux chmod கட்டளையில் numeric மற்றும் symbolic முறைகளை பயன்படுத்துவது எப்படி? கோப்பகங்களில் recursive மாற்றங்களைச் செய்யும்போது ஏற்படும் பிழைகளைத் தவிர்க்க capital X பயன்படுத்துவது
chmod என்ன மாற்றங்களைச் செய்கிறது
chmod ஒரு கோப்பு அல்லது கோப்பகத்தின் (directory) அனுமதி பிட்களை (permission bits) மாற்றுகிறது. இது இரண்டு வகையான குறியீட்டு முறைகளை ஏற்றுக்கொள்கிறது. எண் வடிவம் (numeric form) என்பது ஒரு ஆக்டல் (octal) எண் ஆகும்; இது அனைத்து அனுமதி பிட்களையும் ஒரே நேரத்தில் மாற்றியமைக்கும். குறியீட்டு வடிவம் (symbolic form) என்பது பயனர் வகை மற்றும் செயல்பாட்டைக் குறிப்பிடுகிறது; இது நீங்கள் குறிப்பிடும் பிட்களை மட்டுமே மாற்றும். இவை இரண்டுமே இறுதியில் ஒரே system call-ஐத்தான் அழைக்கின்றன. நீங்கள் குறிப்பிடாத பிட்களுக்கு என்ன நடக்கும் என்பதுதான் இவற்றுக்கு இடையேயான வித்தியாசம்.
ஒரு பயன்முறையை (mode) வாசிப்பதும், அதை மாற்றுவதும் வெவ்வேறு வேலைகள். ஒரு long listing-ல் உள்ள எழுத்துக்கள் உங்களுக்கு இன்னும் தெளிவாகப் புரியவில்லை என்றால், முதலில் drwxr-xr-x என்பது ஒவ்வொரு பகுதியிலும் எதைக் குறிக்கிறது என்பதைப் படியுங்கள். இந்த வழிகாட்டி அவற்றை மாற்றுவது பற்றி மட்டுமே விளக்குகிறது.
இங்குள்ள அனைத்தையும் உங்கள் சாதாரண login பயனராகவே இயக்கவும். root கணக்கு இந்தச் சோதனைகளைத் தவிர்த்துவிடும், எனவே root-ஆக இயக்கும்போது செய்யப்படும் அனுமதி மாற்றங்கள் எதையும் நிரூபிக்காது. நீங்கள் இன்னும் ஒரு புதிய server-ல் root-ஆகவே வேலை செய்து கொண்டிருக்கிறீர்கள் என்றால், குறைந்தபட்ச அதிகாரங்களைக் கொண்ட ஒரு சாதாரண பயனரை உருவாக்கிவிட்டு மீண்டும் வாருங்கள்.
அழித்துவிடக்கூடிய sandbox ஒன்றை அமைத்தல்
cd "$(mktemp -d)"
touch notes.txtmktemp -d என்பது /tmp-ன் கீழ் ஒரு காலி directory-ஐ உருவாக்கி, அந்தப் பாதையை அச்சிடுகிறது. command substitution அந்தப் பாதையை நேரடியாக cd-க்கு அனுப்புகிறது. கீழே உள்ள எந்தக் கட்டளையும் நீங்கள் பயன்படுத்தும் முக்கியமான கோப்புகளைப் பாதிக்காது.
ஒவ்வொரு மாற்றத்தின் முடிவையும் ஒரு கட்டளை தெரிவிக்கும்:
stat -c '%a %A %n' notes.txt%a என்பது mode-ஐ octal எண்ணாக அச்சிடுகிறது, %A அதே mode-ஐ long listing-ல் பயன்படுத்தப்படும் எழுத்து வடிவில் அச்சிடுகிறது, மற்றும் %n கோப்பின் பெயரை அச்சிடுகிறது. கீழே உள்ள தொகுப்புகளில், $-ல் தொடங்கும் வரி நீங்கள் தட்டச்சு செய்வது, அதற்கு கீழே உள்ள வரி அந்த கட்டளை வெளியிட்டது. இவற்றை நீங்களே இயக்கிப் பாருங்கள். உங்கள் கணினியில் கிடைக்கும் வெளியீடு, வரிக்கு வரி இதனுடன் ஒத்துப்போக வேண்டும். ஏனெனில், numeric mode உங்கள் சூழலில் உள்ள எதையும் சார்ந்து இருக்காது.
எண் வடிவம்: ஒவ்வொரு வகுப்புக்கும் ஒரு ஆக்டல் இலக்கம்
முதல் இலக்கம் கோப்பின் உரிமையாளரைக் குறிக்கும். இரண்டாவது இலக்கம் கோப்பின் குழுவைக் குறிக்கும். மூன்றாவது இலக்கம் மற்ற அனைவரையும் குறிக்கும். ஒவ்வொரு இலக்கமும் ஒரு கூட்டுத்தொகை ஆகும், ஒரு பிட்டிற்கு ஒரு மதிப்பு வீதம் கணக்கிடப்படும். ஒரு நேரத்தில் ஒரு பிட்டை அமைத்து, 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 பிட்களையும் கையாளுகிறது, இவை இந்த மூன்று இலக்கங்களுக்கு முன்னால் நான்காவது இலக்கமாக அமையும். அது ஒரு தனி தலைப்பு, இந்த வழிகாட்டி மூன்று இலக்கங்களை மட்டுமே கையாள்கிறது.)
குறியீட்டு வடிவம்: ஒரு class, ஒரு operator, பிறகு bits
முதலில் class-ஐ எழுதவும். u என்பது உரிமையாளர் (owner), g என்பது குழு (group), o என்பது மற்ற அனைவரும் (everyone else), மற்றும் a என்பது அவர்கள் அனைவரையும் ஒரே நேரத்தில் குறிக்கும். பிறகு operator: + bits-ஐ சேர்க்கும், - bits-ஐ நீக்கும், மற்றும் = அந்த class-க்கு நீங்கள் குறிப்பிடும் bits-ஐ மட்டும் அமைத்து மற்ற அனைத்தையும் நீக்கிவிடும். இறுதியாக 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ஒவ்வொரு கட்டளையும் ஒரு class-ஐ மட்டுமே பாதிக்கும், மற்றவற்றை மாற்றாது. கமா (comma) மூலம் clauses-ஐ இணைக்கவும், இடைவெளி விட வேண்டாம். 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= சமக்குறிக்கு (=) பிறகு எதையும் குறிப்பிடாமல் இருந்தால், அது group மற்றும் மற்றவர்களிடமிருந்து அனைத்து bits-களையும் நீக்கிவிடும். உரிமையாளர் மட்டுமே படிக்கக்கூடிய கோப்புகளுக்கு, உதாரணமாக SSH key pair-ன் private பகுதிக்கு, இந்த வடிவம் தேவைப்படும்.
chmod தனது செயல்பாட்டைத் தெரிவிக்கவும் முடியும். இது திரையைப் பார்க்க யாரும் இல்லாத script-களுக்குள் முக்கியமானது.
chmod -v u+x notes.txt
chmod -v u+x notes.txt-v தான் கையாளும் ஒவ்வொரு கோப்பிற்கும் ஒரு வரியை அச்சிடும். இரண்டு கட்டளைகளையும் இயக்கி திரையில் உள்ள வரிகளை ஒப்பிடவும்: முதல் வரி கோப்பின் பெயரையும், அது மாறிய பழைய மற்றும் புதிய mode-களையும் காட்டும். இரண்டாவது வரி, ஏற்கனவே அந்த bit அமைக்கப்பட்டிருந்ததால், mode மாற்றப்படவில்லை என்று காட்டும். -c ஒரு கோப்பில் மாற்றம் நிகழ்ந்தால் மட்டுமே வரியை அச்சிடும், எனவே log-ல் சேமிக்க இதுவே சிறந்தது.
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-ஆக மாற்றின. ஆனால், மற்ற இரண்டு பிரிவுகளை (classes) அப்படியே மாற்றாமல் வைத்திருந்தது ஒன்றே ஒன்றுதான். உங்களுக்குத் தேவையான துல்லியமான இறுதி நிலை என்னவென்று தெரிந்தால், numeric mode-ஐப் பயன்படுத்தவும். நீங்கள் இதுவரை பார்த்திராத ஒரு கணினியில் ஒரே மாதிரியான முடிவைத் தர வேண்டிய deployment script-க்கு இதுவே சரியான முறையாகும். உங்கள் மனதில் add (சேர்) அல்லது remove (நீக்கு) என்ற எண்ணம் இருந்தால், symbolic mode-ஐப் பயன்படுத்தவும். ஏனெனில், numeric முறையில் ஒரு பகுதியை அப்படியே விட்டுவிடு என்று சொல்ல வழியில்லை.
ஒரு புதிய கோப்பின் ஆரம்ப mode, chmod மூலம் தீர்மானிக்கப்படுவதில்லை. அது அந்தக் கோப்பை உருவாக்கிய process-ன் umask மூலம் தீர்மானிக்கப்படுகிறது. உங்கள் shell-ல் umask மற்றும் umask -S கட்டளைகளை இயக்கி, அங்குள்ள மதிப்பைப் பாருங்கள். இது ஒவ்வொரு distribution-க்கும், உங்கள் login shell மற்றும் systemd service-க்கும், ஒவ்வொரு கணக்கிற்கும் (account) இடையில் மாறுபடலாம் என்பதை நினைவில் கொள்ளுங்கள். umask ஒவ்வொரு புதிய கோப்பின் mode-ஐயும் அமைக்கிறது, எனவே chmod இயங்குவதற்கு முன்பே கோப்பின் ஆரம்ப நிலை என்ன என்பதை இதுவே தீர்மானிக்கிறது.
Directory-ல் execute bit-ன் செயல்பாடு
இதுவே அதிக நேரத்தை வீணடிக்கும் ஒரு தவறான புரிதல் ஆகும். ஒரு சாதாரண file-ஐப் பொறுத்தவரை, அந்த file-ஐ kernel இயக்கலாம் என்பதை execute bit குறிக்கிறது. Directory-ல் எந்தக் கட்டளைகளும் இல்லாததால், அங்கு இயக்குவதற்கு எதுவும் இல்லை. ஒரு directory-ல் execute bit என்பது traversal-ஐக் குறிக்கிறது: அதாவது, அதற்குள் இருக்கும் ஒரு பெயரை resolve செய்வதற்கான அனுமதி. dir/file-ஐ அடைய, dir-ல் இந்த அனுமதி உங்களுக்குத் தேவை. Read bit என்பது ஒரு தனிப்பட்ட அனுமதி; இது அந்த directory-ல் உள்ள பெயர்களைப் பட்டியலிட மட்டுமே அனுமதிக்கிறது. இவை இரண்டையும் தனித்தனியாகப் பெற்றிருக்க முடியும், இதைச் செய்து பார்த்தால் புரிந்துகொள்வது எளிது.
$ mkdir vault
$ printf 'hello\n' > vault/secret.txt
$ chmod 600 vault/secret.txt
$ chmod 100 vault
$ echo vault/*
vault/*
$ cat vault/secret.txt
helloShell அந்த pattern-ஐ மாற்றாமல் அப்படியே வெளியிட்டது, ஏனெனில் vault/*-ஐ expand செய்வது என்பது directory-ஐ வாசிப்பதாகும், மேலும் எதுவும் பொருந்தாத glob பிழையை எழுப்புவதற்குப் பதிலாக literal text-ஆகவே கடந்து செல்கிறது. நீங்கள் பெயரை நீங்களே வழங்கியதாலும், traversal அனுமதிக்கப்பட்டதாலும் cat தொடர்ந்து வேலை செய்தது. இப்போது இந்த இரண்டு bit-களையும் மாற்றி அமைக்கவும்.
$ chmod 400 vault
$ echo vault/*
vault/secret.txt
$ cat vault/secret.txt
cat: vault/secret.txt: Permission deniedபெயர்கள் தெரியும், ஆனால் உள்ளடக்கத்தை அணுக முடியாது. Read அனுமதி பட்டியலைத் தருகிறது. Execute அனுமதி உள்ளே செல்வதற்கான வழியைத் தருகிறது. நீங்கள் பயன்படுத்தும் கிட்டத்தட்ட அனைத்து directory-களுக்கும் இந்த இரண்டுமே தேவைப்படும்.
$ chmod 500 vault
$ cat vault/secret.txt
hellochmod -R கட்டளையை எண்ணியல் முறையில் (numeric mode) பயன்படுத்தும்போது கோப்பு முறைமை ஏன் சேதமடைகிறது
-R கட்டளையானது முழு கோப்பு மரத்தையும் (tree) கடந்து சென்று, நீங்கள் குறிப்பிடும் mode-ஐ அது சந்திக்கும் அனைத்து கோப்புகளுக்கும் பொருந்தச் செய்கிறது. ஒரு கோப்பகத்திற்கும் (directory) தரவுக் கோப்பிற்கும் (data file) வெவ்வேறு அனுமதிகள் தேவைப்படுகின்றன, எனவே ஒரே ஒரு எண்ணியல் மதிப்பை இரண்டிற்கும் பயன்படுத்துவது தவறானது. ஒரு சிறிய கோப்பு மரத்தை உருவாக்கி, அதில் என்ன தவறு நடக்கிறது என்பதைப் பாருங்கள்.
$ 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இது நிலையான கோப்புகளைக் கொண்ட ஒரு கோப்பகத்திற்குத் தேவையான அமைப்பாகும். இதோ முதல் தொடர் (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எதுவும் சிதையவில்லை, அதுதான் இங்குள்ள சிக்கல். இந்தத் தவறு எந்த எச்சரிக்கையும் தராமல் நடப்பதால், இது பல ஆண்டுகளாகப் பகிரப்படும் அறிவுறுத்தல்களில் தொடர்ந்து இடம்பெறுகிறது. இப்போது இரண்டு தரவுக் கோப்புகள் தாங்கள் நிரல்கள் (programs) என்று உரிமை கோருகின்றன. Git ஆனது execute bit-ஐச் சேமித்து வைக்கும், எனவே உங்கள் அடுத்த commit-ல் இந்த மாற்றம் அந்த repository-ஐ clone செய்யும் அனைவருக்கும் சென்றுவிடும். மேலும் rsync மற்றும் tar கட்டளைகள் நீங்கள் இந்தக் கோப்பு மரத்தை நகலெடுக்கும் ஒவ்வொரு கணினிக்கும் இந்த மாற்றத்தைக் கொண்டு செல்லும்.
இரண்டாவது தொடர் தவறு வெளிப்படையானது. Execute bit இல்லாத ஒரு 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கோப்புகளின் பெயர்கள் இன்னும் பட்டியலிடப்படும், ஏனெனில் read bit அப்படியே உள்ளது. ஆனால், கோப்பகத்திற்குள் நுழையத் தேவையான execute bit நீக்கப்பட்டுவிட்டதால், அந்தப் பாதைகள் அனைத்தும் மூடப்பட்டுவிடும். 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ஒருமுறை recursive chmod செய்த பிறகு அதைத் திரும்பப் பெற முடியாது (undo). chmod தான் மாற்றியமைத்த பழைய மதிப்புகளைப் பதிவு செய்வதில்லை. எனவே, கோப்புகளின் பழைய அனுமதிகளை நீங்களே மீண்டும் கட்டமைக்க வேண்டும். இது தவறுதலாக rm -rf செய்த பிறகு கோப்புகளை மீட்டெடுப்பது போன்ற மெதுவான மற்றும் நிச்சயமற்ற வேலையாகும். இதிலிருந்து நாம் கற்றுக்கொள்ள வேண்டிய பாடம் இதுதான்: ஒரு recursive கட்டளையை இயக்கும் முன், அதன் இலக்கைச் சரியாகச் சரிபார்த்துவிட்டு, பிறகு Enter அழுத்தவும்.
பெரிய எழுத்து X: கோப்புகளைத் தவிர்த்து, கோப்பகங்களில் மட்டும் இயக்குதல்
Symbolic modes-ல் X மற்றும் x ஆகிய இரண்டையும் பயன்படுத்தலாம். X என்பது, ஒரு கோப்பகமாக (directory) இருந்தால் அல்லது ஏற்கனவே ஏதேனும் ஒரு பிரிவினருக்கு execute bit கொண்ட சாதாரண கோப்பாக (regular file) இருந்தால் மட்டுமே 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ஒரே ஒரு கட்டளை மூலம், கோப்பகங்களை அணுகக்கூடிய நிலையில் வைத்துக்கொண்டு, தரவுக் கோப்புகளை மாற்றாமல் அப்படியே விட்டுவிட முடிந்தது. அந்த script-க்கு ஏற்கனவே execute bit இருந்ததால், அது அப்படியே நீடித்தது; இது X விதியின் இரண்டாம் பாதியாகும். X என்பது ஒரு கோப்பின் தற்போதைய mode-ஐ அடிப்படையாகக் கொண்டு செயல்படுகிறது, எனவே ஏற்கனவே அனைத்து execute bit-களையும் இழந்த ஒரு கோப்பை, இதன் மூலம் மீண்டும் செயல்படுத்த முடியாது.
$ 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 என்பது ஒரு கோப்பில் ஏற்கனவே உள்ள execute bit-ஐ மற்றொரு பிரிவினருக்கும் நீட்டிக்கும்:
$ chmod go+X site/deploy.sh
$ stat -c '%a %A %n' site/deploy.sh
755 -rwxr-xr-x site/deploy.shஎனவே, சிறிய எழுத்து x என்பது நீங்கள் இயக்க விரும்பும் ஒரு குறிப்பிட்ட கோப்பிற்கானது, X என்பது ஒரு கோப்பக மரத்தில் (tree) உள்ள அனைத்திற்கும் பொருந்தும். தற்போதைய mode-ஐ அடிப்படையாகக் கொண்ட விதிகளுக்குப் பதிலாக, ஒவ்வொரு வகைக்கும் துல்லியமான mode-ஐ அமைக்க விரும்பினால், 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 சாதாரண கோப்புகளைத் தேர்ந்தெடுக்கிறது, எனவே ஒவ்வொரு வகைக்கும் உரிய mode கிடைக்கிறது. -exec ... + என்பது ஒவ்வொரு கோப்பிற்கும் தனித்தனி process-ஐத் தொடங்காமல், பல பாதைகளை ஒரே chmod கட்டளையில் தொகுத்துச் செயல்படுத்துகிறது; ஆயிரக்கணக்கான கோப்புகளைக் கொண்ட கோப்பக மரத்தில் இது முக்கியமானது. அந்த script-ன் execute bit, தனி வரியில் வேண்டுமென்றே மீண்டும் சேர்க்கப்படுகிறது.
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 ஆகியவற்றுக்கு இடையே உள்ள வேறுபாடு என்ன?
Numeric mode என்பது ஒரு முழுமையான மாற்றமாகும். இது கோப்பின் அனைத்து permission பிட்களையும் மாற்றியமைக்கும், எனவே நீங்கள் கவனிக்காத classes-களும் மாற்றப்படும். Symbolic mode என்பது ஒரு திருத்தம் மட்டுமே. u+x உரிமையாளருக்கு ஒரு பிட்டை மட்டும் சேர்க்கிறது, மற்ற பிட்களை அப்படியே வைத்திருக்கிறது. ஒரு கோப்பின் இறுதி நிலை துல்லியமாக உங்களுக்குத் தெரிந்தால் numeric முறையைப் பயன்படுத்தவும். ஏதேனும் ஒன்றை மட்டும் சேர்க்க அல்லது நீக்க விரும்பினால் symbolic முறையைப் பயன்படுத்தவும். எந்தக் கட்டளையை இயக்குவதற்கு முன்பும் பின்பும் stat -c '%a %A %n' <file> கட்டளையை இயக்கினால், மாற்றத்தை வெளியீட்டில் காணலாம்.
இணையக் கோப்புகள் உள்ள ஒரு கோப்பகத்தில் (directory) chmod -R 755 பயன்படுத்துவது ஏன் தவறானது?
ஏனெனில் -R ஒரே absolute mode-ஐ கோப்பகங்களுக்கும் சாதாரண கோப்புகளுக்கும் வழங்குகிறது, ஆனால் இவை இரண்டிற்கும் வெவ்வேறு பிட்கள் தேவை. ஒரு கோப்பகத்திற்குள் நுழைய execute பிட் அவசியம். HTML மற்றும் CSS போன்ற தரவுக் கோப்புகளுக்கு அது தேவையில்லை; அவற்றை executable என மாற்றுவது உங்கள் அடுத்த git commit-ல் பதிவாகும் மற்றும் rsync மூலம் அடுத்த கணினிக்கு நகலெடுக்கப்படும். chmod -R u=rwX,go=rX <dir> கட்டளையைப் பயன்படுத்தினால் execute பிட் கோப்பகங்களுக்கு மட்டுமே பொருந்தும், அல்லது find உடன் -type d மற்றும் -type f பயன்படுத்தி ஒவ்வொரு வகைக்கும் தனித்தனி mode-ஐ வழங்கலாம்.
ஒரு கோப்பகத்தில் execute பிட் என்ன செய்கிறது?
இது கோப்பகத்திற்குள் நுழைய அனுமதி அளிக்கிறது, கோப்புகளை இயக்க அல்ல. கோப்பகத்திற்குள் இயக்குவதற்கு என்று எதுவும் இல்லை. ஒரு கோப்பகத்திற்குள் இருக்கும் கோப்பின் பெயரைத் தெரிந்துகொள்ள execute பிட் அவசியம்; எனவே ஒரு கோப்பைத் திறப்பதற்கு முன், அந்தப் பாதையில் உள்ள அனைத்து கோப்பகங்களிலும் இந்த பிட் இருக்க வேண்டும். Read பிட் என்பது கோப்பகத்தில் உள்ள கோப்புகளின் பட்டியலைப் பார்க்க மட்டுமே உதவும். இவை இரண்டையும் தனித்தனியாக வைத்திருக்கலாம்: execute பிட் மட்டும் இருந்தால், பெயர் தெரிந்த கோப்பைத் திறக்கலாம் ஆனால் shell மூலம் கோப்புகளைப் பட்டியலிட முடியாது; read பிட் மட்டும் இருந்தால், கோப்புகளின் பெயர்களைப் பார்க்கலாம் ஆனால் எதையும் திறக்க முடியாது.
சிறிய x-க்கு பதிலாக பெரிய X-ஐ எப்போது பயன்படுத்த வேண்டும்?
கட்டளை recursive-ஆக இருக்கும்போது X-ஐப் பயன்படுத்தவும். X கோப்பகங்களுக்கு execute பிட்டை அமைக்கும்; சாதாரண கோப்புகளுக்கு, ஏற்கனவே ஏதேனும் ஒரு execute பிட் இருந்தால் மட்டுமே இது பொருந்தும். இதனால் தரவுக் கோப்புகளை நிரல்களாக மாற்றாமல், ஒரு முழு மர அமைப்பிலும் (tree) நுழைய முடியும். ஒரு குறிப்பிட்ட கோப்பை மட்டும் மாற்ற விரும்பினால் சிறிய x-ஐப் பயன்படுத்தவும். ஒரு வரம்பை நினைவில் கொள்ள வேண்டும்: ஒரு கோப்பில் அனைத்து execute பிட்களும் நீக்கப்பட்டிருந்தால், X-ஆல் அதை மீண்டும் கொண்டு வர முடியாது, ஏனெனில் அதற்குப் பொருத்தமான பிட் எதுவும் இருக்காது. அதை மீண்டும் சரிசெய்ய chmod u+x <file>-ஐப் பயன்படுத்தவும்.
chmod கோப்பின் உரிமையாளரை மாற்றுமா?
இல்லை. chmod permission பிட்களை மட்டுமே மாற்றும். கோப்பின் உரிமையாளர் chown மற்றும் குழு chgrp ஆகியவற்றால் தீர்மானிக்கப்படுகிறது; ஒரு கோப்பை மற்றொரு பயனருக்கு மாற்ற root அனுமதி தேவை. கோப்பின் பிட்கள், கடைசியாக எழுதியவரைப் பொறுத்தல்லாமல், கோப்பில் பதிவு செய்யப்பட்டுள்ள உரிமையாளர் மற்றும் குழுவைப் பொறுத்தே சரிபார்க்கப்படும் என்பதால் இது முக்கியமானது. உங்களுக்கு எந்தக் கட்டளை தேவை என்பதை முடிவு செய்வதற்கு முன், உரிமையாளர், குழு மற்றும் mode ஆகியவற்றை ஒன்றாகப் பார்க்க stat -c '%U %G %a %n' <file> கட்டளையை இயக்கவும்.