1:exec包执行外部命令,它将os.StartProcess进行包装使得它更容易映射到stdin和stdout,并且利用pipe连接i/o.
2:执行shell命令demo:
func RunCommand(lang, strCommand string) (string, bool) {
pCommand := exec.Command("/bin/ash", "-c", strCommand)
oStdout, err := pCommand.StdoutPipe()
if err != nil {
strError := L(lang, "commd_failed_and_reason", strCommand, "StdoutPipe", err.Error())
return strError, false
}
oStderr, err := pCommand.StderrPipe()
if err != nil {
strError := L(lang, "commd_failed_and_reason", strCommand, "StderrPipe", err.Error())
return strError, false
}
if err := pCommand.Start(); err != nil {
strError := L(lang, "commd_failed_and_reason", strCommand, "Start", err.Error())
return strError, false
}
aBytesErr, err := ioutil.ReadAll(oStderr)
if err != nil {
strError := L(lang, "commd_failed_and_reason", strCommand, "ReadAll stderr", err.Error())
return strError, false
}
if len(aBytesErr) != 0 {
strError := L(lang, "commd_failed_and_reason", strCommand, "stderr is not nil", string(aBytesErr))
return strError, false
}
aBytes, err := ioutil.ReadAll(oStdout)
if err != nil {
strError := L(lang, "commd_failed_and_reason", strCommand, "ReadAll stdout", err.Error())
return strError, false
}
if err := pCommand.Wait(); err != nil {
strError := L(lang, "commd_failed_and_reason", strCommand, "Wait", err.Error())
return strError, false
}
aResult := aBytes
if len(aBytes) > 0 && string(aBytes[len(aBytes)-1:]) == "\n" {
aResult = aBytes[0 : len(aBytes)-1]
}
return string(aResult), true
}