Оболочка LibSSH C++ - основные ошибки удаленного подключения при выходе из области действия

Я новичок в libssh и пытаюсь подключиться к удаленному компьютеру для выполнения некоторых команд. Все соединения и команды возвращаются без ошибок, но затем программа выдает ошибку при выходе из области действия. Что я делаю не так?

Код

#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;
}

Трассировка ГБД

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 ()

person davepmiller    schedule 13.05.2015    source источник


Ответы (1)


После некоторого избиения у нас есть рабочее решение. Первым препятствием было признание того, что удаленный хост должен быть «известным хостом». После этого мне необходимо было получить среду перед запуском моего исполняемого файла. Наконец, мне нужно было дать ему немного времени, чтобы поработать с 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;
}
person davepmiller    schedule 15.05.2015