pkg.re/essentialkaos/ek@v12.36.0+incompatible/system/exec/exec.go (about)

     1  // +build linux, darwin, !windows
     2  
     3  // Package exec provides methods for executing commands
     4  package exec
     5  
     6  // ////////////////////////////////////////////////////////////////////////////////// //
     7  //                                                                                    //
     8  //                         Copyright (c) 2021 ESSENTIAL KAOS                          //
     9  //      Apache License, Version 2.0 <https://www.apache.org/licenses/LICENSE-2.0>     //
    10  //                                                                                    //
    11  // ////////////////////////////////////////////////////////////////////////////////// //
    12  
    13  import (
    14  	"os"
    15  	"os/exec"
    16  	"strings"
    17  )
    18  
    19  // ////////////////////////////////////////////////////////////////////////////////// //
    20  
    21  // Sudo executes command with sudo
    22  func Sudo(user string, args ...string) error {
    23  	var cmdArgs []string
    24  
    25  	cmdArgs = append(cmdArgs, "-u", user)
    26  	cmdArgs = append(cmdArgs, args...)
    27  
    28  	return Run("sudo", cmdArgs...)
    29  }
    30  
    31  // Run executes command
    32  func Run(command string, args ...string) error {
    33  	var cmd = exec.Command(command)
    34  
    35  	cmd.Args = append(cmd.Args, args...)
    36  
    37  	return cmd.Run()
    38  }
    39  
    40  // RunAsUser runs command as a given user
    41  func RunAsUser(user, logFile, command string, args ...string) error {
    42  	var logFd *os.File
    43  	var err error
    44  
    45  	if logFile != "" {
    46  		logFd, err = os.OpenFile(logFile, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
    47  
    48  		if err != nil {
    49  			return err
    50  		}
    51  	}
    52  
    53  	defer logFd.Close()
    54  
    55  	cmd := exec.Command(
    56  		"/sbin/runuser",
    57  		"-s", "/bin/bash",
    58  		user, "-c",
    59  		command, strings.Join(args, " "),
    60  	)
    61  
    62  	if logFd != nil {
    63  		cmd.Stderr = logFd
    64  		cmd.Stdout = logFd
    65  	}
    66  
    67  	return cmd.Run()
    68  }
    69  
    70  // ////////////////////////////////////////////////////////////////////////////////// //