github.com/PandaGoAdmin/utils@v0.0.0-20211208134815-d5461603a00f/os_unix.go (about) 1 // +build linux darwin 2 3 package kgo 4 5 import ( 6 "bytes" 7 "errors" 8 "os" 9 "os/exec" 10 "runtime" 11 "strconv" 12 "strings" 13 "syscall" 14 ) 15 16 // HomeDir 获取当前用户的主目录. 17 func (ko *LkkOS) HomeDir() (string, error) { 18 // Unix-like system, so just assume Unix 19 homeEnv := "HOME" 20 if runtime.GOOS == "plan9" { 21 // On plan9, env vars are lowercase. 22 homeEnv = "home" 23 } 24 25 // First prefer the HOME environmental variable 26 if home := os.Getenv(homeEnv); home != "" { 27 return home, nil 28 } 29 30 var stdout bytes.Buffer 31 32 // If that fails, try OS specific commands 33 if runtime.GOOS == "darwin" { 34 cmd := exec.Command("sh", "-c", `dscl -q . -read /Users/"$(whoami)" NFSHomeDirectory | sed 's/^[^ ]*: //'`) 35 cmd.Stdout = &stdout 36 if err := cmd.Run(); err == nil { 37 result := strings.TrimSpace(stdout.String()) 38 if result != "" { 39 return result, nil 40 } 41 } 42 } else { 43 cmd := exec.Command("getent", "passwd", strconv.Itoa(os.Getuid())) 44 cmd.Stdout = &stdout 45 if err := cmd.Run(); err != nil { 46 // If the error is ErrNotFound, we ignore it. Otherwise, return it. 47 if err != exec.ErrNotFound { 48 return "", err 49 } 50 } else { 51 if passwd := strings.TrimSpace(stdout.String()); passwd != "" { 52 // username:password:uid:gid:gecos:home:shell 53 passwdParts := strings.SplitN(passwd, ":", 7) 54 if len(passwdParts) > 5 { 55 return passwdParts[5], nil 56 } 57 } 58 } 59 } 60 61 // If all else fails, try the shell 62 stdout.Reset() 63 cmd := exec.Command("sh", "-c", "cd && pwd") 64 cmd.Stdout = &stdout 65 if err := cmd.Run(); err != nil { 66 return "", err 67 } 68 69 result := strings.TrimSpace(stdout.String()) 70 if result == "" { 71 return "", errors.New("[HomeDir] blank output when reading home directory") 72 } 73 74 return result, nil 75 } 76 77 // IsProcessExists 进程是否存在. 78 func (ko *LkkOS) IsProcessExists(pid int) (res bool) { 79 if pid > 0 { 80 process, err := os.FindProcess(pid) 81 if err == nil { 82 if err = process.Signal(os.Signal(syscall.Signal(0))); err == nil { 83 res = true 84 } 85 } 86 } 87 88 return 89 }