Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SSH, подскажите как? 
:(
    Опции темы
wowka19
Дата 11.8.2014, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



Пробовал libSSH и libSSH2 - ничего не понял!
Необходимо подключиться к серверу по SSH и запускать на нем программу (сервер на Ubuntu).
Есть рабочий код на C# (клиент на Windows7) выполняющий эту функцию. Причем делает он это через ПАРОЛЬ!!!
Я решил повторить это на C++: взял либу libSSH - но приходит ошибка, мол по паролю этот сервер аутентификацию не проводит. Решил глюк либы, т.к. код на C# РАБОТАЕТ!
Взял libSSH2 - та же ситуация: запустил пример из архива с исходниками - в ответ идет перечисление поддерживаемых методов аутентификации, причем метод через password ОТСУТСТВУЕТ! и аутентификация проходит через метод "keyboard-interactive".

Вопрос: что за фигня? Почему топорный код на C# работает, в то время как ОБЕ сишные либы (независимые друг от друга проекты) кричат о том, что по паролю этот сервер провести аутентификацию ну никак не может?

Вопрос2: Что за чудо-метод "keyboard-interactive"? в примере он реализован через странную функцию (я просто смысл не могу понять):
Код

//Сама чудаковатая функция
static void kbd_callback(const char *name, int name_len,
                         const char *instruction, int instruction_len,
                         int num_prompts,
                         const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts,
                         LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses,
                         void **abstract)
{
    (void)name;    //Вот здесь мой мозг разрывает череп
    (void)name_len;  //... ну зачем это
    (void)instruction;
    (void)instruction_len;
    if (num_prompts == 1) {
        responses[0].text = strdup(password);
        responses[0].length = strlen(password);
    }
    (void)prompts;
    (void)abstract;
} /* kbd_callback */

//а вот кусок в main()
int main(...)
{
..........

if (libssh2_userauth_keyboard_interactive(session, username,
                                                  &kbd_callback) ) {
            fprintf(stderr,
                "\tAuthentication by keyboard-interactive failed!\n");
            goto shutdown;
        } else {
            fprintf(stderr,
                "\tAuthentication by keyboard-interactive succeeded.\n");
        }

..........
}


Вопрос3: Может кто подскажет достойную SSH либу без пережитков pure C и, черт возьми, качественной документацией.

Это сообщение отредактировал(а) wowka19 - 11.8.2014, 09:47
PM MAIL   Вверх
borisbn
Дата 12.8.2014, 07:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4873
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 2
Всего: 135



Я делал через http://the.earth.li/~sgtatham/putty/latest/x86/plink.exe
Просто запускал его из своей программы


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
wowka19
Дата 15.8.2014, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



Аутентификация работает, исполнение команд тоже, но возникла проблема.
Перед основной работой необходимо запустить скрипт, который в контексте текущей сессии работы с linux-консолью устанавливает переменную среды.
Запуск происходит так:
Код

source setenv.meos

После чего идет основная работа. Например:
Код

"../linux/utilbin/orbit_tool -l NO18 47586"


Но orbit_tool жалуется, что необходимой ему переменной среды нет. И в итоге ничего не выходит.
Я полагаю, это происходит из-за того, что после первого запуска plink сессия сбрасывается так как plink завершает свою работу.
Как это обойти?

Это сообщение отредактировал(а) wowka19 - 15.8.2014, 01:25
PM MAIL   Вверх
wowka19
Дата 15.8.2014, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



borisbn, в итоге написал баш скрипт, принимающий параметры. Через консоль ("plink login@host -pw pass ...") всё работает. А вот из QProcess - ничего! Возвращает пустоту. Ошибок нет: всё по нулям. Что я делаю не так?
пробовал всё писать в QProcess::start("flghdpigjpdijh") и отдельно от аргументов QProcess::start("p", QStringList...).
создавал  QProcess и в стеке с QProcess::waitForFinished() и в куче, привязываясь к сигналу fiinished() и readyRead()... Толку ноль :(

Это сообщение отредактировал(а) wowka19 - 15.8.2014, 10:30
PM MAIL   Вверх
wowka19
Дата 15.8.2014, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



В итоге я нашел вывод - он оказался в readAllStandardError(); Но почему?? ведь сигнал finished(int exitCode, QProcess::ExitStatus exitStatus) вернул 0 и NormalExit ???
PM MAIL   Вверх
Google
  Дата 22.5.2019, 05:36 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.2509 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.