Отправка команды с помощью ssh с libssh2 lib

Я пытаюсь использовать libssh2 для отправки команды через ssh, но не могу получить ожидаемый ответ.

Это хорошо сочетается с моим малиновым пи.

Функция для отправки команды:

char * s7c_hardware::sendCmd(char * cmd, bool out)
{
        if (!(channel = libssh2_channel_open_session(session))) return "-1";
        libssh2_channel_setenv(channel, "FOO", "bar");
        if (libssh2_channel_request_pty(channel, "vanilla")) return "-2";
        if (libssh2_channel_shell(channel)) return "-3";
        int rc;
        while ((rc = libssh2_channel_exec(channel, cmd)) ==
            LIBSSH2_ERROR_EAGAIN)
        {
            waitsocket(sock, session);
        }
        char * output = "";
        if (out)
        {
            do
            {
                char buffer[99999];
                rc = libssh2_channel_read(channel, buffer, sizeof(buffer));
                if (rc > 0)
                {
                    fprintf(stderr, "We read:\n");
                    for (int i = 0; i < rc; ++i)
                        fputc(buffer[i], stderr);
                    fprintf(stderr, "\n");
                }
                else {
                    if (rc != LIBSSH2_ERROR_EAGAIN)
                        fprintf(stderr, "libssh2_channel_read returned %d\n", rc);
                }
            } while (rc > 0);
        }
        libssh2_channel_free(channel);
        channel = NULL;
        return output;
}

куда cmd это команда и out это если хочет вывод или нет.

И если я пытаюсь отправить "uptime" и получить время up, я получаю это вместо:

We read:

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat Jul  1 10:27:51 2017 from desktop-ca160hm.local

We read:
pi@rasp:~$

1 ответ

Решение

Я считаю, что запрос оболочки и запрос на выполнение одной команды являются взаимоисключающими. Если вы хотите запустить команду, получить ее вывод и завершить канал (не обязательно сеанс), вы должны запустить libssh2_channel_exec и не беги libssh2_channel_shell,

Другие вопросы по тегам