os.Chown în Go

Schimbă proprietarul și grupul unui fișier; Lchown face același lucru pentru o legătură simbolică.

Sintaxă
func Chown(name string, uid, gid int) error
func Lchown(name string, uid, gid int) error

Ce face os.Chown

os.Chown setează utilizatorul (uid) și grupul (gid) care dețin fișierul, ca chown din terminal. Valoarea -1 înseamnă „nu schimba”: os.Chown(f, -1, gid) schimbă doar grupul.

Pe Linux și macOS doar root poate da un fișier altui utilizator. Un utilizator obișnuit poate schimba grupul doar într-unul din grupurile lui. Pe Windows funcția returnează mereu o eroare.

Dacă name este o legătură simbolică, Chown schimbă fișierul spre care arată. os.Lchown schimbă chiar legătura.

Parametri

Parametru Descriere
name Calea fișierului.
uid ID-ul utilizatorului nou; -1 = neschimbat.
gid ID-ul grupului nou; -1 = neschimbat.

Ce returnează

nil la succes sau eroarea (de obicei „operation not permitted”).

Exemple

Exemplul 1: Setarea proprietarului curent

Să dai fișierul propriului utilizator este mereu permis.

package main

import (
    "fmt"
    "os"
)

func main() {
    os.WriteFile("raport.txt", []byte("ok"), 0o644)
    err := os.Chown("raport.txt", os.Getuid(), os.Getgid())
    fmt.Println("Chown:", err)

    err = os.Chown("raport.txt", -1, -1) // nu schimbă nimic
    fmt.Println("Chown cu -1:", err)
}

Rezultat

Chown: <nil>
Chown cu -1: <nil>

Exemplul 2: Fără drepturi de administrator

Un utilizator obișnuit nu poate da fișierul lui root (uid 0).

package main

import (
    "fmt"
    "os"
)

func main() {
    os.WriteFile("raport.txt", []byte("ok"), 0o644)
    if os.Geteuid() == 0 {
        fmt.Println("rulezi ca root, Chown ar reuși")
        return
    }
    err := os.Chown("raport.txt", 0, 0)
    fmt.Println(err)
}

Rezultat

chown raport.txt: operation not permitted

Exemplul 3: Lchown pe o legătură simbolică

package main

import (
    "fmt"
    "os"
)

func main() {
    os.WriteFile("date.txt", []byte("123"), 0o644)
    os.Symlink("date.txt", "scurtatura")

    fmt.Println("Lchown:", os.Lchown("scurtatura", os.Getuid(), os.Getgid()))
    fmt.Println("Chown:", os.Chown("scurtatura", os.Getuid(), os.Getgid()))
}

Rezultat

Lchown: <nil>
Chown: <nil>

Greșeli frecvente

  • Rulezi programul ca utilizator obișnuit și te aștepți ca Chown spre alt utilizator să meargă. Ai nevoie de root (de exemplu prin sudo).
  • Scrii numele utilizatorului în loc de ID. Funcția primește numere; numele se transformă cu os/user.Lookup.

Comenzi înrudite

  • os.Chmod: Schimbă drepturile de acces (citire, scriere, execuție) ale unui fișier sau director.
  • os.Getuid: Returnează ID-ul utilizatorului și al grupului care rulează programul (reale și efective) și lista grupurilor.
  • os.Symlink: Creează o legătură simbolică (scurtătură) spre alt fișier; Readlink citește spre ce arată.