package main import ( "fmt" "os" "strconv" "syscall" "time" ) func printIds(ii int) { for { fmt.Printf( "gorutine %d: uid=%d euid=%d gid=%d egid=%d\n", ii, syscall.Getuid(), syscall.Geteuid(), syscall.Getgid(), syscall.Getegid(), ) time.Sleep(1e9) } } func main() { if len(os.Args) != 3 { fmt.Printf("Usage: %s UID GID\n", os.Args[0]) os.Exit(1) } uid, err := strconv.Atoi(os.Args[1]) if err != nil { fmt.Println("Wrong UID:", err) os.Exit(1) } gid, err := strconv.Atoi(os.Args[2]) if err != nil { fmt.Println("Wrong GID:", err) os.Exit(1) } for ii := 1; ii < 10; ii++ { go printIds(ii) time.Sleep(1e8) } if err := os.Setgid(gid); err != nil { fmt.Println("Setgid error:", err) os.Exit(1) } if err := os.Setuid(uid); err != nil { fmt.Println("Setuid error:", err) os.Exit(1) } printIds(0) }