1// +build !windows 2 3package exec 4 5import ( 6 "os" 7 "os/exec" 8 "os/user" 9 "path/filepath" 10 "strconv" 11 "syscall" 12) 13 14func BuildCommand(command string) *exec.Cmd { 15 return exec.Command("/bin/sh", "-c", command) 16} 17 18func WritePipe(pipe string, contents []byte) { 19 handle, err := os.OpenFile(pipe, os.O_WRONLY, 0600) 20 21 if err != nil { 22 os.Remove(pipe) 23 log.Fatal(err) 24 } 25 26 handle.Write(contents) 27 handle.Close() 28} 29 30func GetPipe(dir string) string { 31 tmpfn := filepath.Join(dir, "tmp-file") 32 err := syscall.Mkfifo(tmpfn, 0600) 33 if err != nil { 34 log.Fatal(err) 35 } 36 37 return tmpfn 38} 39 40func SwitchUser(username string) { 41 user, err := user.Lookup(username) 42 if err != nil { 43 log.Fatal(err) 44 } 45 46 uid, _ := strconv.Atoi(user.Uid) 47 48 err = syscall.Setgid(uid) 49 if err != nil { 50 log.Fatal(err) 51 } 52 53 err = syscall.Setuid(uid) 54 if err != nil { 55 log.Fatal(err) 56 } 57 58 err = syscall.Setreuid(uid, uid) 59 if err != nil { 60 log.Fatal(err) 61 } 62 63 err = syscall.Setregid(uid, uid) 64 if err != nil { 65 log.Fatal(err) 66 } 67} 68