首页 > 解决方案 > CURLOPT_VERBOSE 没有发送到 STDERR

问题描述

Ubuntu 20.04 使用 libcurl 和以下代码,我可以从命令行查看输出。但是,当重定向输出时./run_me 2>&1 > output.log,cURL 输出仍会显示在屏幕上,并且不会重定向到output.log文件。

cURL 文档指出CURLOPT_VERBOSEwithout 设置CURLOPT_STDERR应该转到STDERR. 但是,它似乎没有。

我们如何将 cURL 输出重定向到STDERR?

CURL* curl = curl_easy_init();
char errBuff[CURL_ERROR_SIZE];
if(curl) {
    struct MemoryStruct chunk;
    chunk.size = 0;
    chunk.memory = calloc(1,sizeof(*chunk.memory));
    if ( !chunk.memory ) {
      return CURLE_FAILED_INIT;
    }

    (void)curl_easy_setopt(curl, CURLOPT_URL, url);
    (void)curl_easy_setopt(curl, CURLOPT_POST, 1L);
    (void)curl_easy_setopt(curl, CURLOPT_USERNAME, username);
    (void)curl_easy_setopt(curl, CURLOPT_PASSWORD, password);
    (void)curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, CONNECTION_TIMEOUT);
    (void)curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    (void)curl_easy_setopt(curl, CURLOPT_CAINFO, trustStore);
    (void)curl_easy_setopt(curl, CURLOPT_SSLCERT, clientCert);
    (void)curl_easy_setopt(curl, CURLOPT_SSLKEY, clientKey);
    (void)curl_easy_setopt(curl, CURLOPT_KEYPASSWD, clientKeyPass);
    (void)curl_easy_setopt(curl, CURLOPT_VERBOSE, 1 );
    (void)curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errBuff );
    errBuff[0] = 0; // empty the error buffer   
    (void)curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
    (void)curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);

    struct curl_slist* list = NULL;
    list = curl_slist_append(NULL, "Content-Type: application/json");
    list = curl_slist_append(list, "Accept: application/json");
    char clBuf[30];
    (void)snprintf(clBuf, 30, "Content-Length: %d", (int)strlen(postData));
    list = curl_slist_append(list, clBuf);
    (void)curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
    (void)curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);
    long httpCode = 0;
    int res = CURLE_FAILED_INIT;
    res = curl_easy_perform(curl);
    (void)curl_easy_getinfo(curl, CURLINFO_HTTP_CODE, &httpCode);
}

标签: curl

解决方案


答案与 shell 如何处理重定向的顺序有关。

从 bash 手册:

请注意,重定向的顺序很重要。例如,命令

  ls > dirlist 2>&1

将标准输出和标准错误都指向文件 dirlist,而命令

  ls 2>&1 > dirlist

仅将标准输出定向到文件 dirlist,因为在将标准输出重定向到 dirlist 之前,标准错误已从标准输出中复制。

将命令更改为./run_me > output.log 2>&1应该会导致 curl 的详细输出也被重定向到文件。


推荐阅读