fix: commands that contain escape characters cannot be executed on the command line (#213)
This commit is contained in:
parent
cda10ed279
commit
b8e1c2fca4
|
@ -2,7 +2,6 @@ package strutil
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"regexp"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
sliceutil "tinyrdm/backend/utils/slice"
|
sliceutil "tinyrdm/backend/utils/slice"
|
||||||
|
@ -133,14 +132,32 @@ func AnyToString(value interface{}, prefix string, layer int) (s string) {
|
||||||
//}
|
//}
|
||||||
|
|
||||||
func SplitCmd(cmd string) []string {
|
func SplitCmd(cmd string) []string {
|
||||||
re := regexp.MustCompile(`'[^']+'|"[^"]+"|\S+`)
|
var result []string
|
||||||
args := re.FindAllString(cmd, -1)
|
var curStr strings.Builder
|
||||||
return sliceutil.FilterMap(args, func(i int) (string, bool) {
|
var preChar int32
|
||||||
arg := strings.Trim(args[i], "\"")
|
inQuotes := false
|
||||||
arg = strings.Trim(arg, "'")
|
|
||||||
if len(arg) <= 0 {
|
for _, char := range cmd {
|
||||||
return "", false
|
if char == '"' && preChar != '\\' {
|
||||||
|
inQuotes = !inQuotes
|
||||||
|
} else if char == ' ' && !inQuotes {
|
||||||
|
if curStr.Len() > 0 {
|
||||||
|
if part, e := strconv.Unquote(`"` + curStr.String() + `"`); e == nil {
|
||||||
|
result = append(result, part)
|
||||||
|
}
|
||||||
|
curStr.Reset()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
curStr.WriteByte(byte(char))
|
||||||
}
|
}
|
||||||
return arg, true
|
preChar = char
|
||||||
})
|
}
|
||||||
|
|
||||||
|
if curStr.Len() > 0 {
|
||||||
|
if part, e := strconv.Unquote(`"` + curStr.String() + `"`); e == nil {
|
||||||
|
result = append(result, part)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue