os.Getuid în Go

Returnează ID-ul utilizatorului și al grupului care rulează programul (reale și efective) și lista grupurilor.

Sintaxă
func Getuid() int
func Geteuid() int
func Getgid() int
func Getegid() int
func Getgroups() ([]int, error)

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() == 0 ca să afli dacă ai drepturi de root. Drepturile se decid după ID-ul efectiv; folosește Geteuid().
  • 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.