Libssh C 包装器 - 离开范围时基本的远程连接segfaults

LibSSH C++ wrapper - Basic remote connection segfaults when leaving scope

本文关键字:远程连接 segfaults 范围 包装 离开 Libssh      更新时间:2023-10-16

我是libssh的新手,并尝试连接到远程计算机以运行一些命令。所有连接和命令都没有错误返回,但是在离开范围时,程序segfault会返回。我究竟做错了什么?

代码

#include <string>
#include <iostream>
using namespace std;
#define SSH_NO_CPP_EXCEPTIONS
#include <libssh/libsshpp.hpp>
int main()
{
    ssh::Session session;
    //Set options
    session.setOption(SSH_OPTIONS_HOST, "192.168.200.101");
    session.setOption( SSH_OPTIONS_USER, "user" );
    //Connect to host
    session.connect();
    //Authenticate user
    session.userauthPassword( "password" );
    //Open channel
    ssh::Channel channel( session );
    channel.openSession();
    //Do something
    channel.requestExec( "ps_aux" );
    //Close channel
    channel.sendEof();
    channel.close();
    //Disconnect
    session.disconnect();
    return 0;
}

GDB跟踪

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff3a70a2f in ssh_channel_free () from /usr/local/lib/libssh.so.4
(gdb) where
#0  0x00007ffff3a70a2f in ssh_channel_free () from /usr/local/lib/libssh.so.4
#1  0x000000000059f436 in ssh::Channel::~Channel() ()
#2  0x000000000059e603 in main ()

在跳动一段时间后,我们有一个工作解决方案。第一个障碍是认识到远程主机必须是"已知主人"。在那之后,对我来说,有必要在运行我的可执行文件之前先来采购环境。最后,我需要给它一些时间来处理sleep( 1 )。享受。

#include <iostream>
using namespace std;
#include <libssh/libsshpp.hpp>
int main()
{
    int port = 22;
    //Can use SSH_LOG_PROTOCOL here for verbose output
    int verbosity = SSH_LOG_NOLOG;
    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, "192.168.52.101" );
        session.connect();
        if( session.isServerKnown() != SSH_SERVER_KNOWN_OK )
        {
            if( session.writeKnownhost() != SSH_OK )
            {
                cout << "writeKnownHost failed" << endl;
            }
            else
            {
                session.connect();
            }
        }
        if( session.userauthPassword( "password" ) != SSH_AUTH_SUCCESS )
        {
            cout << "failed auth" << endl;
        }
        ssh::Channel channel( session );
        channel.openSession();
        //Source environment if necessary, run executable
        channel.requestExec( "source /path/to/set_env.sh; /path/to/executable/..." );
        channel.close();
        channel.sendEof();
        //Unfortunate brute force step, the exec call needed some time
        sleep( 1 );
    }
    catch( ssh::SshException e )
    {
        std::cout << "Error during connection : ";
        std::cout << e.getError() << std::endl;
    }
    return 0;
}