crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Libssh + Qt
Гость_Prophet_*
сообщение 18.6.2010, 15:53
Сообщение #1





Гости








    


Есть задача: Приложение должно иметь возможность удалённо администрировать устройства с линуксом на борту через ssh. Лучшим вариантом было бы просто вызывать для необходимого устройства подобие консоли и работать как из обычной через ssh соединение. Вопрос : Как можно это организовать? Кто работал с ссш под Qt?
Примечание: libssh 0.3.4
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 18.6.2010, 23:44
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Просто нужно присоединить к проекту libssh и скомпилить их вместе. А там уже из GUI цеплять нужные функции или из консоли.
Что именно вызывает затруднение?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Prophet_*
сообщение 21.6.2010, 10:28
Сообщение #3





Гости








    


Скомпилить не проблема. Приложение гуишное, то что имеется сейчас даже подключаться не хочет. Проблема в том чтобы из под гуи дать юзверю работать под "виртуальной консолью".
Вот то что не подключается.
SSH::SSH()
{
    //int ret;

    ssh = ssh_new();
    ssh_opt = ssh_options_new();
    //ret = ssh_option_set_wanted_algos(ssh_opt,KEX_COMP_C_S,"none");
    //ret = ssh_option_set_wanted_algos(ssh_opt,KEX_COMP_S_C,"none");

    ssh_options_set_port (ssh_opt, 22);
    ssh_options_set_host (ssh_opt, "127.0.0.1");
    ssh_options_set_username (ssh_opt, "root");
    ssh_set_options (ssh, ssh_opt);

    ssh_is_server_known(ssh);

    if (ssh_connect(ssh) != SSH_OK)
    {
        qDebug("Error at connection :%s\n",ssh_get_error(ssh));
        return;
    }

    channel = channel_new(ssh);

    if(channel_open_session(channel) !=0)
    {
        qDebug("Error at channel opening :%s\n",ssh_get_error(ssh));
        return;
    }

    /*if(ssh_userauth_password(ssh, "root", "pass") != SSH_AUTH_SUCCESS)
    {
        qDebug("Error at connection :%s\n",ssh_get_error(ssh));
        return;
    }

    if(ssh_userauth_kbdint(ssh, "root", NULL) != SSH_AUTH_SUCCESS)
    {
        qDebug("Error at connection :%s\n",ssh_get_error(ssh));
        return;
    }

    if (ssh_userauth_autopubkey(ssh, "hello") != SSH_AUTH_SUCCESS)
    {
        qDebug("Authenticating with pubkey: %s\n",ssh_get_error(ssh));

        if (ssh_userauth_password (ssh, "root", "pass") != SSH_AUTH_SUCCESS)
        {
            qDebug("Authentication with password failed: %s\n",ssh_get_error (ssh));
            return;
        }
    }*/
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Prophet
  опции профиля:
сообщение 21.6.2010, 14:30
Сообщение #4


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 21.6.2010
Пользователь №: 1827

Спасибо сказали: 0 раз(а)




Репутация:   0  


С подключением вроде разобрался, остаётся вопрос с подключением терминала.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Prophet
  опции профиля:
сообщение 6.7.2010, 13:52
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 21.6.2010
Пользователь №: 1827

Спасибо сказали: 0 раз(а)




Репутация:   0  


Вот что есть на даный момент.
Раскрывающийся текст
void SSH::openSshConnectionForHost(QString host, QString pass)
{
    ssh_options_set_port (ssh_opt, 22);
    ssh_options_set_host (ssh_opt, host.toLocal8Bit().constData());
    ssh_options_set_username (ssh_opt, "root");
    ssh_set_options (ssh, ssh_opt);

    ssh_is_server_known(ssh);

    if (ssh_connect(ssh) != SSH_OK)
    {
        qDebug("Error at connection :%s\n",ssh_get_error(ssh));
        return;
    }

    if(ssh_userauth_password(ssh, "root", pass.toLocal8Bit().constData()) != SSH_AUTH_SUCCESS)
    {
        qDebug("Error at connection :%s\n",ssh_get_error(ssh));
        return;
    }
}

void SSH::slotExecSshCommand(QString ssh_command)
{
    channel = channel_new(ssh);

    if(channel == NULL)
    {
        qDebug("Error at channel open :%s\n",ssh_get_error(ssh));
        return;
    }

    if(channel_open_session(channel) != SSH_OK)
    {
        qDebug("Error at open channel session :%s\n",ssh_get_error(ssh));
        return;
    }

    if(channel_request_exec(channel,ssh_command.toAscii().data()) != SSH_OK)
    {
        qDebug("Error at EXEC :%s\n",ssh_get_error(ssh));
        return;
    }

    out_file = fopen("/home/prophet/out_ssh_log.txt","w");

    int i =0;

    while(i <= 0 || i == data_in_poll)
    {
        i = channel_poll(channel,0);
    }

    data_in_poll = i;

    channel_read_buffer(channel,buff,i,0);

    //QString reply = QString::fromAscii(buffer_get(buff));

    QString reply;

    if(buffer_get_len(buff) != (ulong)i)
    {
        qDebug("Error in poll");
        return;
    }

    reply.sprintf("%s",(char*)buffer_get(buff));

    emit signalSendSshReply(reply);

    fwrite(buff,sizeof(char),i,out_file);
    fclose(out_file);

    channel_close(channel);
}


Основная проблема в том что приходится закрывать и открывать новый канал, по другому вторая команда не проходит. Интересует возможно ли работать как через shell?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sidsukana
  опции профиля:
сообщение 15.7.2011, 10:40
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 158
Регистрация: 23.12.2010
Из: Челябинск
Пользователь №: 2296

Спасибо сказали: 10 раз(а)




Репутация:   2  


Собрал приложение с этой библиотекой, при запуске "Ошибка при запуске приложения (0xc000007b)"
Убираю из кода строку
ssh_session my_ssh_session = ssh_new();
сразу все нормально запускается. Никто не сталкивался?
Win7 x64, .NET Framework 4, libssh 0.5
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 15.7.2011, 11:10
Сообщение #7


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


может
ssh_session my_ssh_session = new ssh_new();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sidsukana
  опции профиля:
сообщение 15.7.2011, 11:39
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 158
Регистрация: 23.12.2010
Из: Челябинск
Пользователь №: 2296

Спасибо сказали: 10 раз(а)




Репутация:   2  


Нет, в документации и в примерах именно так.

http://api.libssh.org/master/libssh_tutor_guided_tour.html

Сообщение отредактировал sidsukana - 15.7.2011, 12:42
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sidsukana
  опции профиля:
сообщение 15.7.2011, 15:30
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 158
Регистрация: 23.12.2010
Из: Челябинск
Пользователь №: 2296

Спасибо сказали: 10 раз(а)




Репутация:   2  


Ну это не проблема qt впринципе, простое консольное приложение c libssh тоже не запускается. :(

Сообщение отредактировал sidsukana - 15.7.2011, 18:24
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 15:50