Ce face os.Getuid
Pe Linux și macOS fiecare proces rulează în numele unui utilizator (uid) și al unui grup principal (gid). os.Getuid și os.Getgid dau ID-urile reale (cine a pornit programul). os.Geteuid și os.Getegid dau ID-urile efective, folosite la verificarea drepturilor; ele diferă doar la programele setuid.
os.Getgroups returnează toate grupurile suplimentare ale utilizatorului. Utilizatorul root are uid 0. Pe Windows funcțiile returnează -1.
Ce returnează
ID-urile ca int; Getgroups returnează un []int și o eroare.
Exemple
Exemplul 1: Afișarea ID-urilor
Valorile depind de utilizator; pe macOS primul utilizator are de obicei uid 501, pe Linux 1000.
package main
import (
"fmt"
"os"
)
func main() {
fmt.Println("uid:", os.Getuid(), "euid:", os.Geteuid())
fmt.Println("gid:", os.Getgid(), "egid:", os.Getegid())
grupuri, err := os.Getgroups()
fmt.Println("grupuri:", grupuri, err)
}
Rezultat posibil (diferă la fiecare rulare)
uid: 1000 euid: 1000
gid: 1000 egid: 1000
grupuri: [4 24 27 1000] <nil>
Exemplul 2: Refuzul de a rula ca root
package main
import (
"fmt"
"os"
)
func main() {
if os.Geteuid() == 0 {
fmt.Println("Nu porni serverul ca root!")
return
}
fmt.Println("rulăm ca utilizator obișnuit")
fmt.Println("uid real = uid efectiv:", os.Getuid() == os.Geteuid())
}
Rezultat
rulăm ca utilizator obișnuit
uid real = uid efectiv: true
Greșeli frecvente
- Verifici
Getuid() == 0ca să afli dacă ai drepturi de root. Drepturile se decid după ID-ul efectiv; foloseșteGeteuid(). - Te bazezi pe aceste funcții pe Windows, unde returnează
-1.
Comenzi înrudite
os.Chown: Schimbă proprietarul și grupul unui fișier; Lchown face același lucru pentru o legătură simbolică.os.Getpid: Getpid returnează ID-ul procesului curent; Getppid, ID-ul procesului care l-a pornit (părintele).os.UserHomeDir: Returnează directorul personal al utilizatorului și directoarele standard pentru configurare și cache.