是什么导致这个golang os.Exec行为(转义双引号)?

时间:2017-09-06 15:05:10

标签: go wget

我有以下代码:

for i := 0; i < 1; i++ {
    wait := rand.Int63n(150) + 300
    time.Sleep(time.Millisecond * time.Duration(wait))
    //
    useragent := "--user-agent='Mozilla/5.0 (X11; CrOS armv7l 8872.76.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.105 Safari/537.36'"
    outDirectory := "--output-document=temp/review-" + strconv.Itoa(i) + ".html"
    header := "--header=\"Content-Type: application/x-www-form-urlencoded;charset=utf-8\""
    uri := "https://play.google.com/store/getreviews"
    payload := "--post-data=id=fi.danskebank.mobilepay&reviewSortOrder=2&xhr=1&reviewType=0&pageNum=" + strconv.Itoa(i)
    cmd := exec.Command("wget", useragent, outDirectory, header, uri, payload)
    fmt.Println(strings.Join(cmd.Args, " "))
    bytes, _ := cmd.CombinedOutput()
    fmt.Println(string(bytes))
}
fmt.Println("Finished crawling")

如果我从

更改有效负载线
payload := "--post-data=id=fi.danskebank.mobilepay&reviewSortOrder=2&xhr=1&reviewType=0&pageNum=" + strconv.Itoa(i)

payload := "--post-data=\"id=fi.danskebank.mobilepay&reviewSortOrder=2&xhr=1&reviewType=0&pageNum=" + strconv.Itoa(i) + "\""

即使运行相应的wget

,它也会返回Server Error 500
wget --user-agent='Mozilla/5.0 (X11; CrOS armv7l 8872.76.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.105 Safari/537.36' --output-document=temp/review-0.html --header="Content-Type: application/x-www-form-urlencoded;charset=utf-8" https://play.google.com/store/getreviews --post-data="id=fi.danskebank.mobilepay&reviewSortOrder=2&xhr=1&reviewType=0&pageNum=0"

它与没有转义引号的后期数据具有相同的响应。

为什么Golang os.Exec会导致这种行为?

1 个答案:

答案 0 :(得分:2)

在shell中执行命令时,shell会处理引号,并且它们不会传递给您正在执行的程序。在Go中执行命令时,不涉及shell处理,因此引用了引号。由于程序不期望它们,它们直接在请求体中传递,服务器响应错误。

与您的问题无关,但如果您没有特定的理由使用wget,那么使用built-in HTTP client可以获得更好的性能,而不是为每个请求分配wget。< / p>