Chmod
Voorbeelden
chmod 705 /var/www/example.com chmod -v u+rw /var/www/example.com chmod -c u=rw /var/www/example.com # "=c": Alleen veranderingen; "=": Absolute rechten chmod -vR g=rx,o=x /var/www/example.com # Combineren van rechten + groepen, maar géén spaties gebruiken na ","
Syntaxis
(Dit hoofdstuk is voor de fun).
Volgens man chmod
is dit de syntaxis:
chmod [OPTION]... MODE[,MODE]... FILE... chmod [OPTION]... OCTAL-MODE FILE... chmod [OPTION]... --reference=RFILE FILE...
Uitgebreider:
chmod [OPTION]... { Symbolic mode [, symbolic mode [, symbolic mode]] | OCTAL-MODE | --reference=RFILE } FILE...
Uitgebreider:
chmod [OPTION]... { u|g|o|a -|+|= {([rwxXst]) | (u|g|o)} [,u|g|o|a -|+|= {([rwxXst]) | (u|g|o)} [,u|g|o|a -|+|= {([rwxXst]) | (u|g|o)}]] | {0...7}[{0...7}[{0...7}[{0...7}]]] } FILE...
Uitgebreider:
chmod [-c | --changes] [-f | --silent | --quiet] [-v | --verbose] [--no-preserver-root] [--preserve-root] { u|g|o|a -|+|= {([rwxXst]) | (u|g|o)} [,u|g|o|a -|+|= {([rwxXst]) | (u|g|o)} [,u|g|o|a -|+|= {([rwxXst]) | (u|g|o)}]] | {0...7}[{0...7}[{0...7}[{0...7}]]] } FILE...
Inleiding
Met chmod
pas je de file mode bits aan van bestanden. In deze context is een map ook een bestand. Aspecten die hierbij een rol spelen:
- modes aka. rechten
- Gebruikersgroeps
- Representaties: Symbolisch of octaal
- Manier van uitvoeren: Absoluut of differentiëel
Rechten
* Read - r * Write - w * Execute - x - Heeft betrekking op zowel bestanden als mappen * Execute - X - Heeft betrekking op alleen mappen * Set ID - s - Set user or group ID upon execution * Sticky bit - t
Gebruikersgroeps (users)
* Eigenaar - u (user) * Groep - g (group) * Overig - o (other) * All - a (all) - Alledrie de groepen bij elkaar
Mappen & rechten
- Leesrechten → Je kunt zien wat er in die map zit, bv.
ls /tmp
- Schrijfrechten → Je kunt bestanden en mappen aanmaken en verwijderen in die map
- Executierechten → Je hebt toegang tot bestanden en submappen in die map; Je kunt met commando
cd
van die pad de CWD maken
Voorbeelden: write
Zonder schrijftoegang op een map, mag je geen wijzigingen aanbrengen in die map. Je mag 'm wel hernoemen
mkdir tmp chmod u-w tmp touch tmp/blub # Permission denied mv tmp tmp2 # Geen probleem rmdir tmp2 # Geen probleem
Voorbeelden: execute
mkdir tmp chmod u-x tmp ll # Geen probleem > total 24 > drwxrwxr-x 3 strompf strompf 4096 Sep 3 18:46 ./ > drwxrwxr-x 7 strompf strompf 4096 Sep 3 17:07 ../ > drw-rwxr-x 2 strompf strompf 4096 Sep 3 18:46 tmp/ ll tmp # Wel een probleem > ls: cannot access 'tmp/.': Permission denied > ls: cannot access 'tmp/..': Permission denied > total 0 > d????????? ? ? ? ? ? ./ > d????????? ? ? ? ? ? ../ mv tmp tmp2 # Ik mag 'm nog steeds hernoemen. Hoe voorkom je dat?
User-rechten op mappen niet aanpasbaar
Geloof of het of niet: chmod op Linux Mint (» Ubuntu » Debian) staat niet toe dat je de rechten aanpast op een map waar je eigenaar van bent. Het idee daarachter is ongetwijfeld om te voorkomen dat je jezelf de toegang ontzegt tot mappen, maar toch vind ik dat stom, en niet passend bij Unix. Lijkt me echt iets voor Windows, maar niet voor Unix. overigens: De versie van chmod in SLES (Suse) heeft dit niet: Daar kun je dit gewoon doen, zonder dat het OS voor je gaat nadenken.
Ter illustratie, dit script
#!/bin/bash # clear rm -rf testdir1 rm -rf testdir2 rm -rf testdir3 rm -rf testdir4 rm -rf testdir5 rm -rf testdir6 rm -rf testdir7 rm -rf testdir8 mkdir testdir1 mkdir testdir2 mkdir testdir3 mkdir testdir4 mkdir testdir5 mkdir testdir6 mkdir testdir7 mkdir testdir8 ls -alF chmod -v 700 testdir1 chmod -v 600 testdir2 chmod -v 500 testdir3 chmod -v 400 testdir4 chmod -v 300 testdir5 chmod -v 200 testdir6 chmod -v 100 testdir7 chmod -v 000 testdir8 echo " " dmesg | tail
geeft deze output:
total 56 drwxrwxr-x 10 jeroen jeroen 4096 Sep 6 21:07 ./ drwxr-xr-x 6 jeroen jeroen 4096 Sep 6 18:31 ../ drwxrwxr-x 2 jeroen jeroen 4096 Sep 6 21:07 testdir1/ drwxrwxr-x 2 jeroen jeroen 4096 Sep 6 21:07 testdir2/ drwxrwxr-x 2 jeroen jeroen 4096 Sep 6 21:07 testdir3/ drwxrwxr-x 2 jeroen jeroen 4096 Sep 6 21:07 testdir4/ drwxrwxr-x 2 jeroen jeroen 4096 Sep 6 21:07 testdir5/ drwxrwxr-x 2 jeroen jeroen 4096 Sep 6 21:07 testdir6/ drwxrwxr-x 2 jeroen jeroen 4096 Sep 6 21:07 testdir7/ drwxrwxr-x 2 jeroen jeroen 4096 Sep 6 21:07 testdir8/ mode of 'testdir1' changed from 0775 (rwxrwxr-x) to 0700 (rwx------) mode of 'testdir2' changed from 0775 (rwxrwxr-x) to 0600 (rw-------) mode of 'testdir3' changed from 0775 (rwxrwxr-x) to 0500 (r-x------) mode of 'testdir4' changed from 0775 (rwxrwxr-x) to 0400 (r--------) mode of 'testdir5' changed from 0775 (rwxrwxr-x) to 0300 (-wx------) mode of 'testdir6' changed from 0775 (rwxrwxr-x) to 0200 (-w-------) mode of 'testdir7' changed from 0775 (rwxrwxr-x) to 0100 (--x------) mode of 'testdir8' changed from 0775 (rwxrwxr-x) to 0000 (---------) [ 5036.038593] wlp3s0: associated [ 5036.064715] IPv6: ADDRCONF(NETDEV_CHANGE): wlp3s0: link becomes ready [ 5036.203781] wlp3s0: Limiting TX power to 20 (20 - 0) dBm as advertised by 6e:c7:ec:62:d6:93 [ 5076.108173] wlp3s0: authenticate with 6e:c7:ec:62:d6:93 [ 5076.109826] wlp3s0: send auth to 6e:c7:ec:62:d6:93 (try 1/3) [ 5076.112319] wlp3s0: authenticated [ 5076.112956] wlp3s0: associate with 6e:c7:ec:62:d6:93 (try 1/3) [ 5076.117108] wlp3s0: RX AssocResp from 6e:c7:ec:62:d6:93 (capab=0x431 status=0 aid=1) [ 5076.119158] wlp3s0: associated [ 5076.138846] wlp3s0: Limiting TX power to 20 (20 - 0) dBm as advertised by 6e:c7:ec:62:d6:93
Als ik daarna commando ls
geef:
total 56 drwxrwxr-x 10 jeroen jeroen 4096 Sep 6 21:07 ./ drwxr-xr-x 6 jeroen jeroen 4096 Sep 6 18:31 ../ -rwx--x--x 1 jeroen jeroen 240 Sep 3 17:48 100-vars-and-expansion.sh* -rwx--x--x 1 jeroen jeroen 1838 Sep 6 21:07 102-directory-and-rights.sh* drwx------ 2 jeroen jeroen 4096 Sep 6 21:07 testdir1/ drwx------ 2 jeroen jeroen 4096 Sep 6 21:07 testdir2/ drwx------ 2 jeroen jeroen 4096 Sep 6 21:07 testdir3/ drwx------ 2 jeroen jeroen 4096 Sep 6 21:07 testdir4/ drwx------ 2 jeroen jeroen 4096 Sep 6 21:07 testdir5/ drwx------ 2 jeroen jeroen 4096 Sep 6 21:07 testdir6/ drwx------ 2 jeroen jeroen 4096 Sep 6 21:07 testdir7/ drwx------ 2 jeroen jeroen 4096 Sep 6 21:07 testdir8/
blijken de rechten voor user volledig te zijn. Het commando dmesg | tail
was in het script opgenomen, om te controleren op foutmeldingen (die waren er niet).
'x' vs 'X'
Het werkt echt, maar de preciese werking ongaat me nog enigszins.
Maak alleen mappen executeerbaar
Als derden (bv. Apache) een map moet kunnen benaderen (=cd), dan moet die map executeerbaar zijn. Bestanden wil je daarintegen vaak juist niet executeerbaar maken. Daar is een oplossing voor [1]:
chmod -R a+rX *
Dit zet de rechten van alle bestanden en mappen op a+r. Daarnaast worden alleen mappen executeerbaar gemaakt (vandaar de hoofdletter 'X').
Mappen vs. bestanden - find
Je kunt met chmod niet op een gemakkelijke manier alleen mappen of alleen bestanden benaderen. De gebruikelijke oplossing hiervoor, is om gebruik te maken van find. Voorbeeld:
Met
find /var/www -type d
krijg je een lijst terug met alle mappen (daar kunnen spaties in zitten).
Met
find /var/www/example.com -type d -exec chmod +x {} \;
maak je al deze mappen executeerbaar.
Overigens kan dit vermoedelijk eenvoudiger met
chmod -R +X /var/www/example.com
Datzelfde kunstje kun je ook uitvoeren voor bestanden:
Met
find /var/www/sterk.dvb -type f
krijg je een recursieve lijst met alle bestanden (weer, inclusief eventuele spaties en/of andere symbolen die misschien geëscaped moeten worden).
Met bv.
find /var/www/sterk.dvb -type f -exec chmod -x {} \;
worden alle bestanden niet-executeerbaar gemaakt.
Zonder recursie
Find nodig, maar zonder recursie? Gebruik dan option -maxdepth 1
. Bv.:
find -maxdepth 1 -type f
Performance
Verbose
Chmod icm. de parameter -v
is ongeveer 5 keer zo langzaam als zonder.
Testscript:
#!/bin/bash # echo " " echo " " echo "######################################################################" echo " " # path="/var/www/example.com" ############################################################################# # Change something with chmod & "-v" ############################################################################# # echo "Change something with chmod & -v..." STARTTIME=$(date +%s%N)/10000000 chmod -Rv 777 $path ENDTIME=$(date +%s%N)/10000000 echo "Change something with chmod & -v... $(($ENDTIME - $STARTTIME))ms" ############################################################################# # Change something with chmod without "-v" ############################################################################# # echo "Change something with chmod but without -v..." STARTTIME=$(date +%s%N)/10000000 chmod -R 777 $path ENDTIME=$(date +%s%N)/10000000 echo "Change something with chmod but without -v... $(($ENDTIME - $STARTTIME))ms"
Find
Gebruik van chmod icm. find, is 200 tot 400 keer zo traag. Dit is voor een beetje uitgebreide WordPress-webwinkel (bv. 30.000 afbeeldingen) significant: Executie gaat al snel richting de minuten.
Aanpassen van de rechten op alleen de mappen in een W3 Total Cache-instantie, kost voor een flinke installatie al snel een minuut. Voor alleen de bestanden, duurt dit ongeveer even lang - In beide gevallen vervelend lang.
Keywords
- chmod cannot change user folder permissions
- chmod 000 user directory
Zie ook
- Mappen, bestanden & rechten (WordPress)
- Mappen, bestanden & rechten - 2020 (WordPress)
- Mappen, bestanden & rechten - 2020 (WordPress, 2)
- Mappen, bestanden & rechten - 2020 (WordPress, 3)
- Rechten mappen & bestanden (Drupal)
Bronnen
- https://stackoverflow.com/questions/3740152/how-do-i-set-chmod-for-a-folder-and-all-of-its-subfolders-and-files-in-linux-ubu
- https://www.washington.edu/computing/unix/permissions.html
- https://askubuntu.com/questions/388489/why-am-i-not-able-to-use-chmod-000-for-a-folder
- https://www.youtube.com/watch?v=bXD1_AICY3c - Ubuntu: Why am I not able to use chmod 000 for a folder?