【问题标题】:How to use libssh's SCP with ssh::Session如何通过 ssh::Session 使用 libssh 的 SCP
【发布时间】:2017-06-05 10:30:44
【问题描述】:

我正在使用 libssh 的 C++ 包装器 (libsshpp.hpp),我正在尝试调用 ssh_scp_new 作为 SCP 例程,方法是给它我的 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 SCP 发送或接收文件?

谢谢!

【问题讨论】:

    标签: c++ scp libssh


    【解决方案1】:

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

    1. 使用 ssh_session:(在 C 中) - 使用 ssh_new() 创建一个 ssh_session 指针。 - 使用 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 - 添加您的控件 - 使用 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++ 中),目前没有包装器允许这样做:( .

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

    【讨论】:

    • 正如我的问题中提到的,我已经能够使用 C 风格的 ssh_session 让它工作(我什至链接了你建议的相同示例......)。我在问是否可以使用 ssh::Session 类来让 SCP 工作。
    • 好吧,你可以注意到在 C++ 中实现的唯一类是 Session api.libssh.org/stable/classssh_1_1Session.html 和 Channel api.libssh.org/master/classssh_1_1Channel.html。所以如果你坚持使用 C++,你可以尝试 Channel 类来发送数据,而不是 SCP。
    • 一个非常规的解决方案是编辑 libssh 代码并重建它,然后将 getCSession() 函数公开以使用 C 函数从包装类获取 ssh_struct。但是这很脏!因为您正在修改 libssh 代码(假设经过良好测试且稳定)。这不是一个好习惯。
    • 我也考虑过修改代码,但正如你所说,它并不干净。我觉得奇怪的是,他们有一个 C++ 包装器,它不能在不使用 C 代码的情况下实现他们本机能够实现的所有功能。
    猜你喜欢
    • 2014-09-03
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 2014-12-21
    • 2013-02-16
    • 2011-11-17
    • 1970-01-01
    • 2017-10-13
    相关资源
    最近更新 更多