如何使用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;
}