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