Chmod

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen

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

Bronnen

x Vs. X