Go Program to Run External Command

Running External Command in Go Code

In Go programming, Command function from exec module (needs to import os/exec module) is available to run the external command.

package main                                                                    
                                                                                
import (
    "fmt" 
    "os/exec"
)
                                                                                
func RunCommand(cmd string) (string, error) {                                   
    cmdOutput, err := exec.Command(cmd).Output()                                
    if err == nil {                                                             
        return string(cmdOutput), nil                                           
    }                                                                           
    return "", err                                                              
}                                                                               
                                                                                
func main() {                                                                   
    fmt.Println("Running command output from go code!")                         
    cmd := "date"     
    result, _ :=  RunCommand(cmd)
    fmt.Println(result)
} 

Output:

$ go build external-command.go 
$ ./external-command 
Running command output from go code!
Fri Dec 14 21:27:07 IST 2018

Output function returns bytes format for the output of executed command.

here string function is used to convert bytes result into string data type.

strings.Trim function can be used to remove leading and trailing unwanted characters in the command output.

Modifying above code to get only actual command output.

package main                                                                    
                                                                                
import (
    "fmt" 
    "os/exec"
    "strings"
)
                                                                                
func RunCommand(cmd string) (string, error) {                                   
    cmdOutput, err := exec.Command(cmd).Output()                                
    if err == nil {                                                             
        return strings.Trim(string(cmdOutput), " \n"), nil                                           
    }                                                                           
    return "", err                                                              
}                                                                               
                                                                                
func main() {                                                                   
    fmt.Println("Running command output from go code!")                         
    cmd := "date"     
    result, _ :=  RunCommand(cmd)
    fmt.Println(result)
} 

Output:

$ go build external-command.go 
$ ./external-command 
Running command output from go code!
Fri Dec 14 21:43:12 IST 2018

Suppose command contains multiple words like "go version", above code raises the error as 'exec: "go version": executable file not found in $PATH'

package main                                                                    
                                                                                
import (
    "fmt" 
    "os/exec"
    "strings"
)
                                                                                
func RunCommand(cmd string) (string, error) {                                   
    cmdOutput, err := exec.Command(cmd).Output()                                
    if err == nil {                                                             
        return strings.Trim(string(cmdOutput), " \n"), nil                                           
    }                                                                           
    return "", err                                                              
}                                                                               
                                                                                
func main() {                                                                   
    fmt.Println("Running command output from go code!")                         
    cmd := "go version"     
    _, err :=  RunCommand(cmd)
    fmt.Println(err)
} 

Output:

$ go build external-command.go 
$ ./external-command 
Running command output from go code!
exec: "go version": executable file not found in $PATH

How to fix the executable file not found in $PATH issue ?

Following go code addresses to fix the executable file not found in $PATH issue.

package main                                                                    
                                                                                
import (
    "fmt" 
    "os/exec"
    "strings"
)
                                                                                
func RunCommand(cmd string) (string, error) {                                   
    cmdOutput, err := exec.Command("sh", "-c", cmd).Output()                                
    if err == nil {                                                             
        return strings.Trim(string(cmdOutput), " \n"), nil                                           
    }                                                                           
    return "", err                                                              
}                                                                               
                                                                                
func main() {                                                                   
    fmt.Println("Running command output from go code!")                         
    cmd := "go version"     
    result, _ :=  RunCommand(cmd)
    fmt.Println(result)
} 

Output:

$ ./external-command 
Running command output from go code!
go version go1.6.4 linux/amd64

Whether sudo command is supported ?

sudo command is also executed in Go code as like below sample code to read bios information.

package main                                                                    
                                                                                
import (
    "fmt" 
    "os/exec"
    "strings"
)
                                                                                
func RunCommand(cmd string) (string, error) {                                   
    cmdOutput, err := exec.Command("sh", "-c", cmd).Output()                                
    if err == nil {                                                             
        return strings.Trim(string(cmdOutput), " \n"), nil                                           
    }                                                                           
    return "", err                                                              
}                                                                               
                                                                                
func main() {                                                                   
    fmt.Println("Running command output from go code!")                         
    cmd := "sudo dmidecode -t bios"     
    result, err :=  RunCommand(cmd)
    if err == nil {
        fmt.Println(result)
        return
    }
    fmt.Println(err.Error())
} 

Output:,/p>

$ go build external-command.go 
$ ./external-command 
Running command output from go code!
# dmidecode 3.0
Getting SMBIOS data from sysfs.
SMBIOS 2.7 present.

Handle 0x0029, DMI type 13, 22 bytes
BIOS Language Information
	Language Description Format: Abbreviated
	Installable Languages: 1
		en-US
	Currently Installed Language: en-US

Handle 0x003F, DMI type 0, 24 bytes
BIOS Information
	Vendor: #####
	Version: #####
	Release Date: 05/18/2016
	Address: #####
	Runtime Size: 128 kB
	ROM Size: 12288 kB
	Characteristics:
		PCI is supported
		PNP is supported
		BIOS is upgradeable
		BIOS shadowing is allowed
		Boot from CD is supported
		Selectable boot is supported
		ACPI is supported
		USB legacy is supported
		BIOS boot specification is supported
		Targeted content distribution is supported
		UEFI is supported
	BIOS Revision: 2.38
	Firmware Revision: 1.12