Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > SSH


Автор: wowka19 11.8.2014, 09:44
Пробовал 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 и, черт возьми, качественной документацией.

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

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

source setenv.meos

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

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


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

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

Автор: wowka19 15.8.2014, 10:45
В итоге я нашел вывод - он оказался в readAllStandardError(); Но почему?? ведь сигнал finished(int exitCode, QProcess::ExitStatus exitStatus) вернул 0 и NormalExit ???

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)