【问题标题】:libssh2_scp_recv is not populating struct statlibssh2_scp_recv 未填充 struct stat
【发布时间】:2012-08-01 19:57:12
【问题描述】:

我可以成功地将文件从一端发送到另一端 libssh2_scp_send()。当我尝试使用接收文件时 libssh2_scp_recv(),不过,它没有填满struct stat 带数据的参数。文件大小总是返回“0”。

struct stat    file_info;

LIBSSH2_CHANNEL *channel = libssh2_scp_recv( session, source_file, &file_info );

printf( "file_info.st_size = %lu.\n",       file_info.st_size );

file_info 中的任何其他字段也会为空,即使 channel 不为 NULL。

我的会话已正确打开并适用于任何其他 SSH 操作 (运行远程命令,发送文件...)

我正在使用“libssh2-1.3.0”。

请问有什么线索吗?

非常感谢。


编辑:

我把第三行改成:

fprintf( stderr, "** file_info { st_size = %lu; st_atime = %lu }. SSH last error = %d",
    file_info.st_size, file_info.st_atime,
    libssh2_session_last_errno( info->session ) );

结果是:

** file_info { st_size = 0; st_atime = 0 }. SSH last error = 0`.

就是这样。返回的频道是有效的,我可以从中读取。 libssh2_session_last_errno() 没有错误,但 st_size 仍然为空。

【问题讨论】:

    标签: c ssh scp libssh2


    【解决方案1】:

    尝试做一些错误检查,这样我们就可以确切地看到发生了什么:

    channel = libssh2_scp_recv(session, path_to_file, &struct_stat);
    if (!channel && (libssh2_session_last_errno(session) != LIBSSH2_ERROR_EAGAIN)) 
    {
        if ((struct_stat.st_mode == 0) && (struct_stat.st_atime == 0) && \
               (struct_stat.st_mtime == 0) && (struct_stat.st_size == 0)) 
        {
           fprintf(stderr, "No file found and the error %d\n", \
                         libssh2_session_last_errno(session));
    
           exit (EXIT_FAILURE);
       }
    }
    

    希望对您有所帮助。

    问候。

    【讨论】:

    • 这将允许我进行更精确的诊断,但无法解释为什么 st_size == 0 即使知道文件存在并且有数据。如果我尝试读取文件直到没有更多字节,我可以正确读取它。
    • @JaxWR : 什么返回这个 libssh2_session_last_errno(session)?
    • ** file_info { st_size = 0; st_atime = 0 }. SSH last error = 0。就是这样。返回的频道有效,没有errno对应libssh2_session_last_errno()
    【解决方案2】:

    我的系统上的 libssh2_scp_recv(session, source_file, &file_info) 仅填充 source_file 的更改时间和权限模式。因此,file_info.st_ctim.tv_sec 和 file_info.st_mode 具有有效值。

    如果您查看 libssh2_scp_recv 的 libssh2 API 文档,http://libssh2.sourceforge.net/doc/#libssh2scprecv,它并不能保证 file_info 的所有字段都会被填充。

    文件的结尾由 libssh2_channel_read 返回的单个 NULL(0) 字节指示。

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 2012-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      • 2021-12-17
      • 2013-07-21
      • 2021-05-06
      相关资源
      最近更新 更多