Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用libssh';使用ssh::Session的SCP 我使用LIPSH的C++包装器(),我试图通过给它变量来调用SCP例程,但是我得到以下错误: 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类来运行SCP,但是很显然这不是我喜欢的解决方法。通过查看libsshpp.hpp,我找到了一个getCSession()函数,但它只能私下访问,我不知道如何使用它(或者它是否是我认为的那样)_C++_Scp_Libssh - Fatal编程技术网

如何使用libssh';使用ssh::Session的SCP 我使用LIPSH的C++包装器(),我试图通过给它变量来调用SCP例程,但是我得到以下错误: 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类来运行SCP,但是很显然这不是我喜欢的解决方法。通过查看libsshpp.hpp,我找到了一个getCSession()函数,但它只能私下访问,我不知道如何使用它(或者它是否是我认为的那样)

如何使用libssh';使用ssh::Session的SCP 我使用LIPSH的C++包装器(),我试图通过给它变量来调用SCP例程,但是我得到以下错误: 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类来运行SCP,但是很显然这不是我喜欢的解决方法。通过查看libsshpp.hpp,我找到了一个getCSession()函数,但它只能私下访问,我不知道如何使用它(或者它是否是我认为的那样),c++,scp,libssh,C++,Scp,Libssh,以下是我的示例代码: #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_VERB

以下是我的示例代码:

#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;
}
#包括
#包括
#包括
int main()
{
int端口=22;
int verbosity=SSH\u LOG\u协议;
ssh::会话;
尝试
{
session.setOption(SSH\u OPTIONS\u LOG\u详细性和详细性);
setOption(SSH\u选项\u端口和端口);
setOption(SSH_OPTIONS_USER,“USER”);
setOption(SSH_OPTIONS_HOST,“HOST”);
session.connect();
if(session.isServerKnown()!=SSH\u SERVER\u KNOWN\u OK)
{
if(session.writeKnownhost()!=SSH\u确定)
{

STD::CUT

正如您可以看到的错误。您必须决定使用SSH::会话类或SSHSession结构。LIPSSH库是C库,它只有一个C++包装器(它可能不包含所有的函数,如原始语言)。 下面是如何根据官方文档使用libssh库(当前稳定版本0.7.3)发送connect和发送文件

  • 使用ssh_会话(C中) -使用ssh_new()创建ssh_会话指针。 -使用int-ssh\u-connect(ssh\u会话)进行连接。 -使用*int ssh\u options\u set(ssh\u session session,enum ssh\u options\u e type,const void*value)*查看此文档 -添加控件 -使用ssh_scp_new(session,ssh_scp_WRITE | ssh_scp_RECURSIVE,“.”)发送文件; -使用ssh\u free(ssh\u会话)释放连接

    //您可以尝试这个简单的程序(来自正式的libssh教程)
    #包括
    #包括
    #包括
    int scp_写入(ssh_会话)
    {
    ssh_scp scp;
    int rc;
    scp=ssh\u scp\u新建
    (session,SSH_SCP_WRITE | SSH_SCP_RECURSIVE,“.”);
    如果(scp==NULL)
    {
    fprintf(stderr,“分配scp会话时出错:%s\n”,ssh\u get\u错误(会话));
    返回SSH_错误;
    }
    rc=ssh_scp_init(scp);
    如果(rc!=SSH\u确定)
    {
    fprintf(stderr,“初始化scp会话时出错:%s\n”,ssh_get_错误(会话));
    ssh_scp_free(scp);
    返回rc;
    }
    ssh_scp_close(scp);
    ssh_scp_free(scp);
    返回SSH_OK;
    }
    int main(int argc,char*argv[])
    ssh_session my_ssh_session=ssh_new();
    if(my_ssh_session==NULL)
    返回1;
    scp_写入(我的ssh_会话);
    ssh_free(我的ssh_会话);
    返回0;
    }     
    
  • 使用ssh::Session(在C++中)目前没有包装器允许这样做:(

  • 下面是一些使用libssh库的有用示例。希望对您有所帮助!

    正如我在问题中提到的,我已经能够使用C风格的ssh_会话使其工作(我甚至链接了您建议的相同示例…)我想问一下是否可以使用SSH::session类来获得SCP工作。正如你可以注意到的,C++中实现的唯一类是会话和通道。所以如果你坚持C++,你可以尝试用通道类来发送数据,而不是SCP。一个非传统的解决方案是在制作GETCSESETH()之后编辑LBSSH代码并重建它。函数public使用C函数从包装类获取ssh_结构。但这是肮脏的!因为您正在修改libssh代码(假定经过良好测试且稳定)这不是一个好的做法。我也考虑修改代码,但是正如你所说,它并不干净。我觉得奇怪的是,他们将有一个C++封装器,它们没有实现任何能力,而不诉诸C代码。
    //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;
    }