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  }