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 // ////////////////////////////////////////////////////////////////////////////////// //