gopkg.in/essentialkaos/ek.v3@v3.5.1/system/exec.go (about)

     1  // +build linux, darwin, !windows
     2  
     3  package system
     4  
     5  // ////////////////////////////////////////////////////////////////////////////////// //
     6  //                                                                                    //
     7  //                     Copyright (c) 2009-2016 Essential Kaos                         //
     8  //      Essential Kaos Open Source License <http://essentialkaos.com/ekol?en>         //
     9  //                                                                                    //
    10  // ////////////////////////////////////////////////////////////////////////////////// //
    11  
    12  import (
    13  	"os"
    14  	"os/exec"
    15  	"strings"
    16  )
    17  
    18  // ////////////////////////////////////////////////////////////////////////////////// //
    19  
    20  // SudoExec execute some command with sudo
    21  func SudoExec(user string, args ...string) error {
    22  	var cmdArgs []string
    23  
    24  	cmdArgs = append(cmdArgs, "-u", user)
    25  	cmdArgs = append(cmdArgs, args...)
    26  
    27  	return Exec("sudo", cmdArgs...)
    28  }
    29  
    30  // Exec execute some command
    31  func Exec(command string, args ...string) error {
    32  	var cmd = exec.Command(command)
    33  
    34  	cmd.Args = append(cmd.Args, args...)
    35  
    36  	return cmd.Run()
    37  }
    38  
    39  // RunAsUser run command as some user
    40  func RunAsUser(user, logFile string, args ...string) error {
    41  	var log *os.File
    42  	var err error
    43  
    44  	if logFile != "" {
    45  		log, err = os.OpenFile(logFile, os.O_APPEND|os.O_WRONLY, 0644)
    46  
    47  		if err != nil {
    48  			return err
    49  		}
    50  	}
    51  
    52  	defer log.Close()
    53  
    54  	cmd := exec.Command("/sbin/runuser", "-s", "/bin/bash", user, "-c", strings.Join(args, " "))
    55  
    56  	if logFile != "" && log != nil {
    57  		cmd.Stderr = log
    58  		cmd.Stdout = log
    59  	}
    60  
    61  	return cmd.Run()
    62  }
    63  
    64  // ////////////////////////////////////////////////////////////////////////////////// //