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

是什么导致了golang os.Exec行为(转义双引号)?,go,wget,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) Chrom

我有以下代码:

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")

它将返回服务器错误500,即使在运行相应的
wget
时:

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"
它将具有与post数据相同的响应,不带转义引号


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

在shell中执行命令时,shell会处理引号,而引号不会传递给正在执行的程序。当您在Go中执行命令时,不涉及shell处理,因此引号被传递。由于程序不需要它们,因此它们直接在请求体中传递,服务器响应时出错


与您的问题无关,但如果您没有使用wget的具体原因,那么使用wget将获得比为每个请求提供wget更好的性能。

我不确定您指的是什么“bug”。在一种情况下,您通过一个shell执行
wget
,它将为您解释引号,而在另一种情况下,您直接执行一个二进制文件,它不像shell那样对参数进行lex处理。这是两件不同的事情,所以你本质上是在问“为什么shell像shell一样解析引号?是的,就是这样;对问题进行了编辑,这样就不会暗示这是Golang功能或bug。考虑过删除这个问题,但有人可能会像我一样产生类似的误解。如果有人认为这不是一个有用的问题答案,也许我们应该删除它。谢谢;没有想到“中间没有壳”的事。我使用的是wget,因为在很多情况下性能并不是那么重要,因为网站有每秒请求的限制。相反,通过构建“wget脚本”,我可以与不使用Golang的人共享它们。因此,在某种意义上,我正在试验一种与编程语言无关的刮取过程:wget(uri+params)->类似jQuery的HTML处理器->json。根据wget和jQuery风格的配置以及解释这些配置的声明性程序,将允许更广泛的重用性。但最终我只是为了好玩而编写代码。
payload := "--post-data=\"id=fi.danskebank.mobilepay&reviewSortOrder=2&xhr=1&reviewType=0&pageNum=" + strconv.Itoa(i) + "\""
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"