package main import ( "os" "time" "syscall" "fmt" "strconv" ) 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) } en := syscall.Setgid(gid) if en != 0 { fmt.Println("Setgid error:", os.Errno(en)) os.Exit(1) } en = syscall.Setuid(uid) if en != 0 { fmt.Println("Setuid error:", os.Errno(en)) os.Exit(1) } printIds(0) }