os.Chmod în Go

Schimbă drepturile de acces (citire, scriere, execuție) ale unui fișier sau director.

Sintaxă
func Chmod(name string, mode FileMode) error

Ce face os.Chmod

os.Chmod este echivalentul comenzii chmod. Drepturile se scriu în octal, trei cifre pentru proprietar, grup și ceilalți: 4 = citire, 2 = scriere, 1 = execuție. 0o600 = doar proprietarul citește și scrie; 0o755 = proprietarul face tot, ceilalți citesc și execută.

Spre deosebire de crearea fișierelor, Chmod nu ține cont de umask: drepturile date sunt cele care rămân. Pe Windows se poate schimba doar atributul „doar citire”.

Parametri

Parametru Descriere
name Calea fișierului sau directorului.
mode Drepturile noi, de exemplu 0o644, 0o600, 0o755.

Ce returnează

nil la succes sau eroarea (fișier inexistent, nu ești proprietarul).

Exemple

Exemplul 1: Un fișier privat

Mode() afișează drepturile în formatul cunoscut din ls -l.

package main

import (
    "fmt"
    "os"
)

func main() {
    os.WriteFile("parola.txt", []byte("secret"), 0o644)
    os.Chmod("parola.txt", 0o644)
    info, _ := os.Stat("parola.txt")
    fmt.Println("înainte:", info.Mode())

    os.Chmod("parola.txt", 0o600)
    info, _ = os.Stat("parola.txt")
    fmt.Println("după:   ", info.Mode())
}

Rezultat

înainte: -rw-r--r--
după:    -rw-------

Exemplul 2: Un script executabil

Verificăm bitul de execuție pentru proprietar (0o100).

package main

import (
    "fmt"
    "os"
)

func main() {
    os.WriteFile("backup.sh", []byte("#!/bin/sh\necho gata\n"), 0o644)
    info, _ := os.Stat("backup.sh")
    fmt.Println("executabil?", info.Mode().Perm()&0o100 != 0)

    os.Chmod("backup.sh", 0o755)
    info, _ = os.Stat("backup.sh")
    fmt.Println("executabil?", info.Mode().Perm()&0o100 != 0, info.Mode())
}

Rezultat

executabil? false
executabil? true -rwxr-xr-x

Exemplul 3: Fișier doar pentru citire

După 0o444, scrierea eșuează cu „permission denied” (dacă nu rulezi ca root).

package main

import (
    "fmt"
    "os"
)

func main() {
    os.WriteFile("contract.txt", []byte("versiunea finală"), 0o644)
    os.Chmod("contract.txt", 0o444)

    err := os.WriteFile("contract.txt", []byte("modificat"), 0o644)
    fmt.Println("scriere:", err)
}

Rezultat

scriere: open contract.txt: permission denied

Greșeli frecvente

  • Scrii drepturile în zecimal: os.Chmod(f, 755) înseamnă altceva decât 0o755.
  • Dai 0o777 ca să „meargă”. Oricine de pe sistem poate modifica fișierul; dă doar drepturile necesare.

Comenzi înrudite

  • os.Chown: Schimbă proprietarul și grupul unui fișier; Lchown face același lucru pentru o legătură simbolică.
  • os.WriteFile: Scrie octeții dați într-un fișier: îl creează dacă lipsește și îi înlocuiește conținutul dacă există.
  • os.File.Stat: Returnează informații despre fișierul deschis: nume, dimensiune, drepturi, data modificării, dacă e director.
  • os.IsPermission: Spune dacă o eroare a apărut din lipsa drepturilor de acces (permission denied).