在 cURL 中请求文件列表 SFTP 时显示完整日期

Show full date when asking for file list SFTP in cURL

我将 cURL 与 STFP 服务器一起使用,我正在尝试为我的后续过程获取正确的日期格式。

此时,当我请求文件列表时,我得到了这个:

-rw-r--r--    1 0        0          718541 Dec 24  18:25 myfile.png

问题是我还需要获取年份,但只有文件超过一年时年份才可用,在这种情况下,将 hour:minute 替换为年份

-rw-r--r--    1 0        0          718541 Dec 24  2000 myoldfile.png

在 FTP 中有参数 "MLSD",可以格式化显示完整日期的日期,但我没有找到 SFTP

的等价物

鉴于结果看起来像 ls -la unix 命令,我尝试使用 ls -la --full-time 但此参数似乎在 SFTP 服务器上不起作用。

有没有办法检索包含日期的文件列表:年月日时分

什么格式?

您似乎无法使用 SFTP 协议使 curl 生成完整的时间戳。

但这是 curl 的限制,而不是 SFTP 协议或服务器本身。

SFTP 服务器为每个文件提供完整的时间戳(和其他属性)。此外,它还提供文件的文本 "description"。 curl 打印该描述(并丢弃完整的时间戳和其他属性)。 OpenSSH SFTP 服务器以您看到的格式生成 "description"。因此,您看到的行为是 OpenSSH SFTP 服务器和 curl 的组合。

使用另一个可以利用服务器提供的完整时间戳的 SFTP 客户端或 SFTP 库(在 Python、PHP 等中)会有所帮助。

我使用 curl 选项解决了我的问题 CURLOPT_FILETIME

通过提供所需文件的名称,它会检索可以在 time_t.

上进行转换的 long

这是它如何工作的示例(可以在 curl 示例代码中找到):

设置连接

curl_easy_setopt(mHandleCurl, CURLOPT_URL, "sftp://192.168.1.10/myfile.txt");
curl_easy_setopt(mHandleCurl, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);   
curl_easy_setopt(mHandleCurl, CURLOPT_PORT, 22);
curl_easy_setopt(mHandleCurl, CURLOPT_USERNAME, sUsername);
curl_easy_setopt(mHandleCurl, CURLOPT_PASSWORD, sPassword);

设置一个空回调 - 看起来是必需的

curl_easy_setopt(mHandleCurl, CURLOPT_WRITEFUNCTION, throw_away);
curl_easy_setopt(mHandleCurl, CURLOPT_FILETIME, 1L);

curl_easy_perform(mHandleCurl); // Perform

回调代码:

static size_t throw_away(void *ptr, size_t size, size_t nmemb, void *data)
{
   (void)ptr;
   (void)data;
   /* we are not interested in the headers itself,
      so we only return the size we would have saved ... */
   return (size_t)(size * nmemb);
}

然后获取文件时间戳

long lTimestamp = -1;
curl_easy_getinfo(mHandleCurl, CURLINFO_FILETIME, &lTimestamp);

并将其转换为 time_t 或 struct tm 以获得完整的时间戳访问权限

time_t t_filetimestamp = (time_t) lTimestamp;

struct tm* tm_filetimestamp;
tm_filetimestamp = localtime(&t_filetimestamp);