【问题标题】:scp .tar file from remote machine using C program & libssh使用 C 程序和 libssh 从远程计算机获取 scp .tar 文件
【发布时间】:2016-08-24 09:42:00
【问题描述】:

我编写了一个代码,它使用 libssh scp API 从远程设备读取文件。

我有一个特定要求,我想从远程设备 scp 一个 .tar 文件。 我能够将 .tar 内容读入缓冲区,但我不确定如何从该缓冲区中创建 .tar 文件。

任何帮助将不胜感激。

谢谢。

代码sn-p:

   char      *t_filename, t_buffer[32768];
   ....
   t_rc = ssh_scp_pull_request(t_scp);
   switch(t_rc)
   {
       case SSH_SCP_REQUEST_NEWFILE:
            t_filesize = ssh_scp_request_get_size(t_scp);
            t_filename = strdup(ssh_scp_request_get_filename(t_scp));
            t_filemode = ssh_scp_request_get_permissions(t_scp);
            fprintf(stderr, "Receiving file %s, size %d, permisssions 0%o\n", t_filename, t_filesize, t_filemode);
            ssh_scp_accept_request(t_scp);
            t_rc = ssh_scp_read(t_scp, t_buffer, sizeof(t_buffer));
            if(t_rc == SSH_ERROR)
            {
               fprintf(stderr, "Error receiving file data: %s\n", ssh_get_error(in_session));
               ssh_scp_close(t_scp);
               ssh_scp_free(t_scp);
               return t_rc;
            }
            fprintf(stderr, "Bytes received = %d\n", t_rc);
            FILE *fptr = fopen(t_filename, "w");
            if(NULL != fptr)
            {
               fwrite(t_buffer,sizeof(t_buffer),1,fptr);
               fclose(fptr);
            }
            break;
    }

【问题讨论】:

    标签: c linux tar scp libssh


    【解决方案1】:

    使用open()fopen() 创建一个本地文件,然后使用write()fwrite() 输入原始数据。完成后,致电 close()fclose()

    更新了你的code-sn-p,没有经过编译测试,但是给了你思路。

    应该重复远程读取,直到收到整个文件,此外,您可能会收到小于 sizeof (t_buffer) 的块,所以不要写出比收到的更多的数据。

       char      *t_filename, t_buffer[32768];
       ....
       t_rc = ssh_scp_pull_request(t_scp);
       switch(t_rc)
       {
           case SSH_SCP_REQUEST_NEWFILE:
                t_filesize = ssh_scp_request_get_size(t_scp);
                t_filename = strdup(ssh_scp_request_get_filename(t_scp));
                t_filemode = ssh_scp_request_get_permissions(t_scp);
                fprintf(stderr, "Receiving file %s, size %d, permisssions 0%o\n", t_filename, t_filesize, t_filemode);
                FILE *fptr = fopen(t_filename, "w");
                if(NULL == fptr)
                {
                    fprintf (stderr, "Error opening local file: %s, error %s\n", t_filename, strerror (errno));
                    ssh_scp_deny_request (t_scp, "Unable to open local file");
                    break;
                }
                ssh_scp_accept_request(t_scp);
    
                do
                {
                    t_rc = ssh_scp_read(t_scp, t_buffer, sizeof(t_buffer));
                    if(t_rc == SSH_ERROR)
                    {
                        fprintf(stderr, "Error receiving file data: %s\n", ssh_get_error(in_session));
                        fclose(fptr);
                        ssh_scp_close(t_scp);
                        ssh_scp_free(t_scp);
                        return t_rc;
                    }
                    fprintf(stderr, "Bytes received = %d\n", t_rc);
                    if (fwrite(t_buffer,t_rc,1,fptr) != 1)
                    {
                        fprintf (stderr, "Error writing file data: %s\n", strerror (errno));
                        fclose(fptr);
                        ssh_scp_close(t_scp);
                        ssh_scp_free(t_scp);
                        return t_rc;
                    }             
                } while (t_rc != 0);
                fclose (fptr);
                break;
        }
    

    【讨论】:

    • 谢谢斯蒂安。我使用了 fwrite,但是在写入文件后文件大小非常小,并且 tar 没有将其识别为存档文件。因此,我增加了用于从远程设备读取的缓冲区的大小。现在,我得到了 tar 文件实际大小的一半,并且它可以被 tar 实用程序识别。知道为什么我没有收到 tar 文件的所有内容吗?
    • 你能分享一些代码吗,否则我们只会胡乱猜测哪里出了问题
    • 在问题陈述中添加了代码 sn-p。如果你愿意,我可以单独与你分享整个功能。请提出建议。
    • 谢谢斯蒂安。它有效:) 我刚刚测试过,因为我昨天没有设置。
    猜你喜欢
    • 2015-09-01
    • 2012-07-09
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多