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

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