**Chmod** (**ch**ange **mod**e) on Unix-ohjelma, jolla muutetaan tiedostojen ja hakemistojen käyttöoikeuksia. Käyttöoikeuksia kutsutaan Unixissa yleisesti myös moodeiksi (mode). Oikeuksien muuttamiseen chmodissa voidaan käyttää joko numeerisia tai symbolisia moodeja.

Komennon syntaksi
-----------------

```
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... MODE[,MODE]... FILE...

```

Vapaaehtoisia argumentteja ovat muun muassa `-R` (rekursiiviset muutokset), `-v` (tulostaa tiedot kaikista käsitellyistä tiedostoista ja kansioista) ja `-f` (sivuuttaa suuren osan virheilmoituksista).

Ensimmäinen versio on komennon numeerinen muoto, joka tehokas erityisesti silloin kun halutaan asettaa tiedoston tai kansion oikeudet kokonaan uusiksi. Jälkimmäinen on komennon symbolinen muoto, joka puolestaan soveltuu erityisesti tilanteisiin, joissa halutaan lisätä tai poistaa tiettyjä oikeuksia vaikuttamatta tiedoston muihin oikeuksiin.

Tiedostojen ja kansioiden oikeudet voi tarkastaa komennolla `ls`.

### Numeerinen muoto

Komennon numeerisella muodolla voidaan tehokkaasti vaihtaa kerralla tiedoston tai kansion kaikki oikeudet. Numeerinen muoto hyväksyy maksimissaan 4 oktaalista numeroa. Oikeanpuoleiset kolme numeroa edustavat omistajan, ryhmän ja muiden käyttäjien oikeuksia, vastaavassa järjestyksessä. Neljännellä numerolla (ensimmäinen vasemmalta) voidaan asettaa erityinen `setuid`, `setgid`, tai `sticky` moodi.

Numeeriset oikeudet muodostuvat seuraavasti:

| # | Oikeus |
| --- | --- |
| 1 | suoritusoikeus eli x-oikeus |
| 2 | kirjoitusoikeus eli w-oikeus |
| 4 | lukuoikeus eli r-oikeus |

Yhdistetyt oikeudet saadaan laskemalla halutut oikeudet yhteen, jolloin esimerkiksi suoritus- ja lukuoikeus saadaan luvulla 1 + 4 = 5. Seuraavassa on vielä lista eri lukuarvojen muodostamista oikeuksista.

**Numeeriset oikeudet**

| # | Oikeudet | rwx |
| --- | --- | --- |
| 7 | kaikki | 111 |
| 6 | luku ja kirjoitus | 110 |
| 5 | luku ja suoritus | 101 |
| 4 | vain luku | 100 |
| 3 | kirjoitus ja suoritus | 011 |
| 2 | vain kirjoitus | 010 |
| 1 | vain suoritus | 001 |
| 0 | ei oikeuksia | 000 |

Seuraava komento esimerkiksi antaa tiedostoon testi.txt kaikille käyttäjäluokille lukuoikeuden, ryhmälle lisäksi suoritusoikeuden ja käyttäjälle vielä kirjoitusoikeudenkin:

```
$ chmod 754 testi.txt

```

### Symbolinen muoto

Muutettavat oikeudet on myös mahdollista määrätä symbolisilla parametreillä. Symboleista muodostetaan merkkijono, joka seuraavaa seuraavaa rakennetta:

```
$ chmod [kohde][operaattori][moodit] <tiedosto> ...

```

*Kohteella* määritetään kenen oikeuksia ollaan muuttamassa. Mikäli kohdetta ei ole määritetty käytetään oletusarvona kohdetta "kaikki". Seuraavassa taulukossa on listattu tunnistetut symbolit ja niiden merkitykset. Tiedoston tai kansion omistajaa ja ryhmää on mahdollista vaihtaa komennolla chown

| Kohde | Käyttäjäluokka | Kuvaus |
| --- | --- | --- |
| `u` | käyttäjä (**u**ser) | tiedoston omistaja |
| `g` | ryhmä (**g**roup) | tiedoston ryhmään kuuluvat käyttäjät |
| `o` | muut (**o**thers) | käyttäjät, jotka eivät kuuluu kumpaankaan edellisistä |
| `a` | kaikki (**a**ll) | kaikki edelliset, sama kuin `ugo` |

*Operaattorilla* määritetään kuinka oikeuksia muutetaan. Komento hyväksyy seuraavat operaattorit: 

| Operaattori | Kuvaus |
| --- | --- |
| `+` | lisää määrätyt moodit määrätyille luokille |
| `-` | poistaa määrätyt moodit määrätyiltä luokilta |
| `=` | määrättyjen luokkien moodit asetetaan täsmälleen määrättyjen moodien mukaisiksi |

*Moodit* ilmaisevat mitä oikeuksia määrätyille luokille ollaan antamassa, poistamassa tai asettamassa. Seuraavassa on listattu käytössä olevat perusmoodit:

| Moodi | Nimi | Kuvaus |
| --- | --- | --- |
| `r` | luku (**r**ead) | tiedoston lukeminen tai kansion sisällön listaaminen |
| `w` | kirjoitus (**w**rite) | tiedostoon tai kansioon kirjoittaminen |
| `x` | suoritus (e**x**ecute) | tiedoston suorittaminen tai kansiopuun listaaminen rekursiivisesti |

Näiden lisäksi hyväksytään moodit `X`, `s` (`setuid/setgid`) ja `t` (`sticky`).

Seuraava komento esimerkiksi lisää kaikille lukuoikeuden tiedostoon testi.txt

```
$ chmod a+r testi.txt

```

Symbolisessa muodossa on mahdollista tehdä useita muutoksia kerralla. Tällöin parametriksi annetaan useita edellä kuvatun mukaisia merkkijonoja toisistaan pilkulla erotettuina. Seuraava lause esimerkiksi poistaa ryhmältä ja "kaikilta" kaikki oikeudet ja lisää omistajalle kirjoitus- ja lukuoikeuden tiedostoon testi.txt:

```
$ chmod ag-rwx,u+rw testi.txt

```

Esimerkkejä
-----------

| Komento | Selitys |
| --- | --- |
| `chmod 750 *tiedosto*` | nimetyn tiedoston omistusoikeuksiksi `rwxr-x---` (omistajalle kaikki oikeudet, ryhmälle luku- ja suoritusoikeus, muille ei oikeuksia) |
| `chmod u=rwx,g=rx,o= *tiedosto*` | samat oikeudet kuin edellä käyttäen symbolista notaatiota |
| `chmod u=rw,go= *tiedosto*` | tiedoston omistajalle luku- ja kirjoitusoikeus, ryhmällä ja muilla ei oikeuksia |
| `chmod -R u+w,go-w *dokumentit*` | muutetaan kansion *dokumentit* oikeudet ja rekursiivisesti kaikki sen sisältö seuraavasti: lisätään kirjoitusoikeus omistajalle ja evätään se kaikilta muilta |
| `chmod = *tiedosto*` | poistaa kaikilta kaikki oikeudet tiedostoon käyttäen symbolista notaatiota |
| `chmod 777 *tiedosto*` | antaa kaikille luokille täydet oikeudet tiedostoon käyttäen numeerista notaatiota |
| `chmod 750 *public\_html*` | asettaa kansiolle *public\_html* oikeuksiksi `rwxr-x---` |
| `chmod 0644 *index.html*` | asettaa tiedostolle *index.html* oikeuksiksi `-rw-r--r--`, sama kuin `u=rw (4+2),go=r (4)`, 0 alussa tarkoittaa, ettei aseteta *erikoismoodeja* ja se voidaan yhtä hyvin jättää poiskin |

Muuta
-----

Monissa Unix-versioissa on myös mahdollista tehdä tiedostoille tarkkoja käyttöoikeuslistoja muun muassa yksittäisten käyttäjien ja ryhmien mukaan. POSIX-standardiin kehitetty ehdotus on myöhemmin vedetty pois mutta useat järjestelmät toteuttavat sen.

Linuxissa käyttöoikeuslistoja käsitellään `setfacl` ja `getfacl` -komentojen avulla.

Muut käyttöjärjestelmät
-----------------------

Muihin komentoa tukeviin käyttöjärjestelmiin kuuluu Plan 9.

Komento on myös IBM i -alustalle.

Katso myös
----------

* Chown
* Unix

Lähteet
-------

1. 1 2  Jukka K. Korpela: Unix-opas: Luku 7 - Tiedostot ja hakemistot *jkorpela.fi*.  18.10.2003. Viitattu 14.9.2013.
2. ↑  UNIX man pages - chmod *unixhelp.ed.ac.uk*. Viitattu 14.9.2013.
3. ↑  10 Access Control Lists in Linux *documentation.suse.com*. Viitattu 23.3.2021. (englanniksi)
4. ↑  An introduction to Linux Access Control Lists (ACLs) *redhat.com*. Viitattu 21.11.2020. (englanniksi)
5. ↑
6. ↑  Programming Qshell (PDF) *ibm.com*. Viitattu 12.8.2021. (englanniksi)