如何在ssh :: Session中使用libssh的SCP

时间:2017-06-05 01:19:52

标签: c++ scp libssh

我正在使用libssh的C ++包装器( libsshpp.hpp )而我正试图通过给我一个SCP例程来调用 ssh_scp_new ssh::Session变量,但我收到以下错误:

cannot convert ‘ssh::Session’ to ‘ssh_session {aka ssh_session_struct*}’ for argument ‘1’ to ‘ssh_scp_struct* ssh_scp_new(ssh_session, int, const char*)’

我能够通过完全不使用C ++ ssh :: Session类并使用C example来使SCP工作,但显然这不是我首选的解决方法。查看 libsshpp.hpp 我能够找到 getCSession()函数,但它只能私有访问,我不知道如何使用它(或者它是否均匀使用)我认为是什么。)

以下是我的示例代码:

#include <iostream>
#include <fstream>

#include <libssh/libsshpp.hpp>

int main()
{
  int port      = 22;
  int verbosity = SSH_LOG_PROTOCOL;

  ssh::Session session;

  try
  {
    session.setOption(SSH_OPTIONS_LOG_VERBOSITY, &verbosity);
    session.setOption(SSH_OPTIONS_PORT,          &port);
    session.setOption(SSH_OPTIONS_USER,          "user");
    session.setOption(SSH_OPTIONS_HOST,          "host");

    session.connect();

    if (session.isServerKnown() != SSH_SERVER_KNOWN_OK)
    {
      if (session.writeKnownhost() != SSH_OK)
      {
        std::cout << "writeKnownHost failed" << std::endl;
      }
      else
      {
        session.connect();
      }
    }

    if (session.userauthPassword("password") !=
        SSH_AUTH_SUCCESS)
    {
      std::cout << "Authentication Error" << std::endl;
    }

    ssh_scp scp;
    int     rc;

    // error cannot convert ‘ssh::Session’ to ‘ssh_session {aka ssh_session_struct*}’
    scp = ssh_scp_new(session, SSH_SCP_WRITE | SSH_SCP_RECURSIVE, ".");
  }
  catch (ssh::SshException e)
  {
    std::cout << "Error during connection : ";
    std::cout << e.getError() << std::endl;
  }

  return 0;
}

我如何使用C ++方法向libssh发送或接收文件?

谢谢!

1 个答案:

答案 0 :(得分:0)

你可以看到错误。你必须决定使用ssh :: Session类或ssh_session结构。 libssh库是一个C库,它只有一个C ++包装器(可能不包含原始语言中的所有功能) 以下是根据官方文档使用libssh库(当前稳定版本0.7.3)发送连接和发送文件的方法。

  1. 使用 ssh_session :(在C中) -use ssh_new()创建一个ssh_session指针。 -use int ssh_connect(ssh_session session)进行连接。 -use * int ssh_options_set(ssh_session session,enum ssh_options_e type,const void * value)*查看本文档http://api.libssh.org/stable/group__libssh__session.html#ga7a801b85800baa3f4e16f5b47db0a73d - 加你的控件 -send文件使用 ssh_scp_new(session,SSH_SCP_WRITE | SSH_SCP_RECURSIVE,“。”); - 使用 ssh_free(ssh_session session)

    免费连接
    //You can try this simple program (from official libssh tutorials)
    #include <libssh/libssh.h>
    #include <stdlib.h>
    #include <stdio.h>
    int scp_write(ssh_session session)
    {
        ssh_scp scp;
        int rc;
        scp = ssh_scp_new
            (session, SSH_SCP_WRITE | SSH_SCP_RECURSIVE, ".");
        if (scp == NULL)
        {
            fprintf(stderr, "Error allocating scp session: %s\n",         ssh_get_error(session));
            return SSH_ERROR;
        }
        rc = ssh_scp_init(scp);
        if (rc != SSH_OK)
        {
            fprintf(stderr, "Error initializing scp session: %s\n", ssh_get_error(session));
            ssh_scp_free(scp);
            return rc;
        }
        ssh_scp_close(scp);
        ssh_scp_free(scp);
        return SSH_OK;
    }
    
    int main(int argc, char* argv[])
        ssh_session my_ssh_session = ssh_new();
        if (my_ssh_session == NULL)
            return 1;
        scp_write(my_ssh_session );
        ssh_free(my_ssh_session);
        return 0;
    }     
    
  2. 使用 ssh :: Session (在C ++中),当前没有包装器允许这样做:(。

  3. 以下是使用libssh库的一些有用示例。希望能帮助到你 ! http://api.libssh.org/master/libssh_tutorial.html