如何使用libssh和sftp在C / C ++中复制文件

时间:2012-12-03 20:54:49

标签: c++ c ssh sftp libssh

我在这里发帖是因为我需要一些与 libssh 相关的代码的帮助。

我阅读了所有正式文件here,但如果有人能点亮我,我仍然不理解我需要做的事情,我会很高兴。

实际上我想将文件从客户端复制到远程服务器但我不明白如何使用库libssh和libssh中的函数sftp来实现。

情况是:ssh会话已打开,sftp会话也是打开的,我可以创建一个文件,并使用lib ssh的集成功能从客户端写入服务器。

我找不到一种简单的方法,可以通过简单的函数将文件从客户端复制到服务器,例如 sftp_transfer(sourceFile(如c:\ my document \ hello world.txt),RemoteFile(/ home / user / hello world.txt),right(读写))

根据我从教程中理解的内容,它首先在远程位置(服务器)创建一个文件,然后用这行代码打开这个文件:

file = sftp_open(sftp, "/home/helloworld.txt",access_type,1);

之后,在服务器上创建文件,然后用缓冲区写入这个创建的文件:

const char *helloworld = "Hello, World!\n";
int length = strlen(helloworld);
nwritten = sftp_write(file, helloworld, length);

我的问题是,如果我有一个文件,例如.doc文件,我想将该文件从c:\ mydocument \ document.doc传输/上传到远程服务器/home/user/document.doc如何我可以用这种方法吗?

如何将此文件放入 sftp_write()函数中,以便像示例函数中的helloworld一样发送它?

我可能在编程方面不够理解,但我真的试图理解它并且我坚持使用它。

提前感谢您的帮助

见下面我用来测试的代码示例:

// Set variable for the communication
      char buffer[256];
      unsigned int nbytes;

        //create a file to send by SFTP
        int access_type = O_WRONLY | O_CREAT | O_TRUNC;
        const char *helloworld = "Hello, World!\n";
        int length = strlen(helloworld);

        //Open a SFTP session
        sftp = sftp_new(my_ssh_session);
        if (sftp == NULL)
        {
            fprintf(stderr, "Error allocating SFTP session: %s\n",
            ssh_get_error(my_ssh_session));
            return SSH_ERROR;
        }
        // Initialize the SFTP session
        rc = sftp_init(sftp);
        if (rc != SSH_OK)
        {
            fprintf(stderr, "Error initializing SFTP session: %s.\n",
            sftp_get_error(sftp));
            sftp_free(sftp);
            return rc;
         }

        //Open the file into the remote side
        file = sftp_open(sftp, "/home/helloworld.txt",access_type,1);
        if (file == NULL)
        {
            fprintf(stderr, "Can't open file for writing: %s\n",ssh_get_error(my_ssh_session));
            return SSH_ERROR;
        }

        //Write the file created with what's into the buffer
        nwritten = sftp_write(file, helloworld, length);
        if (nwritten != length)
        {
            fprintf(stderr, "Can't write data to file: %s\n",
            ssh_get_error(my_ssh_session));
            sftp_close(file);
            return SSH_ERROR;
        }

` 

3 个答案:

答案 0 :(得分:4)

以通常的方式打开文件(使用C ++的fstream或C的stdio.h),将其内容读取到缓冲区,并将缓冲区传递给sftp_write

这样的事情:

ifstream fin("file.doc", ios::binary);
if (fin) {
  fin.seekg(0, ios::end);
  ios::pos_type bufsize = fin.tellg(); // get file size in bytes
  fin.seekg(0); // rewind to beginning of file

  char* buf = new char[bufsize];
  fin.read(buf, bufsize); // read file contents into buffer

  sftp_write(file, buf, bufsize); // write to remote file
}

请注意,这是一个非常简单的实现。您可能应该以附加模式打开远程文件,然后以块的形式写入数据,而不是发送单个大量数据。

答案 1 :(得分:0)

以下示例在循环中使用ifstream,以将整个文件无效地加载到内存中(已接受的答案会这样做):

ifstream fin("C:\\myfile.zip", ios::binary);

while (fin)
{
    #define MAX_XFER_BUF_SIZE 10240
    char buffer[MAX_XFER_BUF_SIZE];
    fin.read(buffer, sizeof(buffer));
    if (fin.gcount() > 0)
    {
        ssize_t nwritten = sftp_write(NULL, buffer, fin.gcount());
        if (nwritten != fin.gcount())
        {
            fprintf(stderr, "Can't write data to file: %s\n", ssh_get_error(ssh_session));
            sftp_close(file);
            return 1;
        }
    }
}

答案 2 :(得分:-1)

我使用的是示例here

sftp_read_sync使用无限循环将文件从服务器读取到/path/to/profile 来自服务器路径/etc/profile