Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/55: Рейтинг темы: голосов - 55, средняя оценка - 4.55
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772

libssh2: как запустить удаленно бинарник и получить его вывод

01.05.2021, 17:02. Показов 10520. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Написал приложение. Простое. В конце бесконечный цикл.
Данную программу передаю через библиотеку libssh2 на удаленный пк. Авторизируюсь чз libssh2 как root.
Через нее же удаленно меняю права этого бинарника на 777 и удаленно пытаюсь запустить через "./myapp"
Но никакого вывода в клиент и никакого висящего процесса на удаленной машине нет.
Подскажите, что нужно сделать для запуска?

Кстати, попробовал удаленно прочитать текстовый файл через команду cat, тоже ничего не вышло.
Другие команды работают нормально, ls, killall, reboot, cd, find, rm....
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.05.2021, 17:02
Ответы с готовыми решениями:

Как осуществить транзит данных бинарник -> excel -> бинарник?
Объясните на таком примере Первое действие: нужно взять из этого бинарника (4 Кб) первые четыре значения (т.е начиная с 0x00000000...

Как получить бинарник image?
Здравствуйте подскажите как получить бинарный код для вставки в sql server. Если можно пример.

Как удаленно запустить сайт?
К примеру нет интернета, как можно открыть сайт? Добавлено через 2 часа 32 минуты Через localhost?!

16
 Аватар для peter_irich
367 / 223 / 53
Регистрация: 18.10.2017
Сообщений: 2,386
02.05.2021, 10:31
Я не понимаю, что значит "через libssh2". Я пользуюсь для входа ssh и для копирования - scp.
Как root авторизоваться не надо, надо как пользователь, а потом, если нужен root, то становиться им уже там.
Попробуйте на удалённом компьютере запустить программу в фоне, через &.
Либо запустить её через команду at, но это может не сработать.
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
02.05.2021, 14:23  [ТС]
Цитата Сообщение от peter_irich Посмотреть сообщение
Я не понимаю, что значит "через libssh2". Я пользуюсь для входа ssh и для копирования - scp.
Как root авторизоваться не надо, надо как пользователь, а потом, если нужен root, то становиться им уже там.
Попробуйте на удалённом компьютере запустить программу в фоне, через &.
Либо запустить её через команду at, но это может не сработать.
"Через libssh2" означает, что написано приложение (1), которое использует библиотеку libssh2 для подключения по ssh к серверу. В качестве диагностики для сервера было написано приложение (2). С помощью (1) организуется подключение, передача приложения (2) и запуск. Запустить не получается... Команда со стороны клиента "выполняется", ничего в ответ не возвращается и в выводе top на сервере данный процесс не появляется... Вот такая беда... Пример приложения (1) взят по образу примера из состава библиотеки libssh2... Может через скрипт как-то надо запускать... Не понимаю...
Пробовал запускать командой:
./myapp.elf
echo "./myapp.elf" | at now
Ничего не помогает...
Захожу через путти, виже переданное на сервер приложение и вручную все запускается...

Как-то так...
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
02.05.2021, 14:34
sitesv, может быть вы код покажете?
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
02.05.2021, 15:18  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
sitesv, может быть вы код покажете?
За основу взят пример https://www.libssh2.org/examples/ssh2_exec.html
Непосредственно выполнение команды и получение результата обернул в функцию:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
int execcmd(const char *commandline, int sock, LIBSSH2_SESSION *session){
    int rc;
    int bytecount = 0;
    int exitcode;
    char *exitsignal=(char *)"none";
    LIBSSH2_CHANNEL *channel = NULL;
    while((channel = libssh2_channel_open_session(session)) == NULL && libssh2_session_last_error(session,NULL,NULL,0) == LIBSSH2_ERROR_EAGAIN){
        waitsocket(sock, session);
    }
    if(channel == NULL){
        fprintf(stderr,"Error\n");
        exit( 1 );
    }
    while( (rc = libssh2_channel_exec(channel, commandline)) == LIBSSH2_ERROR_EAGAIN){
        waitsocket(sock, session);
    }
    if(rc != 0){
        fprintf(stderr,"Error: %i\n", rc);
        exit( 1 );
    }
    for( ;; ){
        /* loop until we block */
        int rc;
        do{
            char buffer[0x4000];
            memset(buffer, 0, sizeof(buffer));
 
 
            rc = libssh2_channel_read( channel, buffer, sizeof(buffer) );
            if (rc > 0){
                int i;
                bytecount += rc;
                fprintf(stderr, "We read:\n");
                for(i=0; i < rc; ++i) fputc( buffer[i], stderr);
                fprintf(stderr, "\n");
            }
            else{
                if (rc != LIBSSH2_ERROR_EAGAIN){
                    // no need to output this for the EAGAIN case
                    fprintf(stderr, "SSH read returned %d\n", rc);
                }
            }
        }
        while( rc > 0 );
 
        // this is due to blocking that would occur otherwise so we loop on this condition
        if (rc == LIBSSH2_ERROR_EAGAIN) waitsocket(sock, session);
        else
            break;
    }
 
    exitcode = 127;
 
    while((rc = libssh2_channel_close(channel)) == LIBSSH2_ERROR_EAGAIN) waitsocket(sock, session);
    if(rc == 0){
        exitcode = libssh2_channel_get_exit_status(channel);
        libssh2_channel_get_exit_signal(channel, &exitsignal, NULL, NULL, NULL, NULL, NULL);
    }
 
    if (exitsignal) printf("\nGot signal: %s\n", exitsignal);
    else            printf("\nEXIT: %d bytecount: %d\n", exitcode, bytecount);
 
    libssh2_channel_free(channel);
    channel = NULL;
 
    return bytecount;
}
Непосредственно вызов функции:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
        if(access(myapp_cpp, 0) != -1)
    {
        answer_bytes = execcmd("killall myapp_cpp.elf", sock, session);
        if(send_file(myapp_cpp, "/home/user/myapp_cpp.elf", sock, session) < 0){
            fprintf(stderr, "ERROR: sending file error! Press any key...\n", rc);
            getch();
            goto shutdown;
        }
        answer_bytes = execcmd("chmod 777 /home/user/myapp_cpp.elf", sock, session);
        answer_bytes = execcmd("cd /home/user/; ls -l;", sock, session);
        answer_bytes = execcmd("echo './home/user/myapp_cpp.elf' | at now", sock, session);
//answer_bytes = execcmd("./home/user/myapp_cpp.elf", sock, session);  -- пробовал еще так
    }
вывод ls -l отображается...
0
 Аватар для peter_irich
367 / 223 / 53
Регистрация: 18.10.2017
Сообщений: 2,386
02.05.2021, 16:29
И без специального приложения, просто из скрипта можно переслать на удалённый компьютер что угодно,
запустить там любую команду, для этого достаточно команд ssh и scp. Хотя бы и приложение для запуска
было каждый раз новое, достаточно ssh и scp. От чего зависит, сработает ли при удалённом соединении
команда at, не знаю.
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
02.05.2021, 18:54  [ТС]
Цитата Сообщение от peter_irich Посмотреть сообщение
И без специального приложения, просто из скрипта можно переслать на удалённый компьютер что угодно,
запустить там любую команду, для этого достаточно команд ssh и scp. Хотя бы и приложение для запуска
было каждый раз новое, достаточно ssh и scp. От чего зависит, сработает ли при удалённом соединении
команда at, не знаю.
__________________
Данный подход обусловлен авторизацией, которую необходимо скрыть от пользователя... плюс сделать то, чтобы пользователь даже не думал и потенциально не мог ошибиться в тех или иных командах.... ведь иначе черевато...
Может есть кто шарит в теме?
0
 Аватар для peter_irich
367 / 223 / 53
Регистрация: 18.10.2017
Сообщений: 2,386
02.05.2021, 20:41
Скрипт вам запустит что угодно, в т.ч. и ssh от имени какого надо пользователя без его участия.
В любом случае не принято входить по ssh как root. На мой взгляд, вы делаете что-то лишнее.
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
02.05.2021, 20:53  [ТС]
Цитата Сообщение от peter_irich Посмотреть сообщение
Скрипт вам запустит что угодно, в т.ч. и ssh от имени какого надо пользователя без его участия.
В любом случае не принято входить по ssh как root. На мой взгляд, вы делаете что-то лишнее.
Тут вопрос заключается в том, почему не получается удаленно запустить приложение через libssh2. Использование root тут не играет никакой ведь роли...
0
 Аватар для peter_irich
367 / 223 / 53
Регистрация: 18.10.2017
Сообщений: 2,386
02.05.2021, 21:15
Так запускайте командой через ssh. Я так выключаю удалённый компьютер, либо вручную, либо автоматически,
но в любом случае ssh посылает команду, которую надо выполнить.
В моём случае команда находится на удалённом компьютере в ~/bin.
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
02.05.2021, 23:36  [ТС]
Цитата Сообщение от peter_irich Посмотреть сообщение
Так запускайте командой через ssh. Я так выключаю удалённый компьютер, либо вручную, либо автоматически,
но в любом случае ssh посылает команду, которую надо выполнить.
В моём случае команда находится на удалённом компьютере в ~/bin.
Скопировал программу в bin. Работает.... Но почему так? Почему запуск из домашнего каталога /home/user/myapp_cpp.elf через "./myapp_cpp.elf" не работает, а запуск из bin - без проблем... Кто-нибудь может объяснить в чем разница?
0
 Аватар для peter_irich
367 / 223 / 53
Регистрация: 18.10.2017
Сообщений: 2,386
03.05.2021, 08:02
У ssh могут быть свои особенности. Например, как я недавно говорил в одной своей теме,
при автоматическом запуске ей потребовалось имитировать терминал с помощью опций "-t -t".
Попробуйте запускать не через "./", а с полным путём. Но я бы удовлетворился помещением в ~/bin.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
03.05.2021, 13:50
Цитата Сообщение от sitesv Посмотреть сообщение
Кто-нибудь может объяснить в чем разница?
Скорее всего текущий каталог (то, что вы указываете через ./) не соответствует тому, где на самом деле лежала ваша программа.

Добавлено через 36 секунд
Попробуйте не класть программу в bin, а использовать полный путь при запуске.
0
 Аватар для peter_irich
367 / 223 / 53
Регистрация: 18.10.2017
Сообщений: 2,386
03.05.2021, 14:27
Я, когда посылаю команду чрез ssh, указываю её "bin/cmd", она в ~/bin.
Либо указать не "./cmd", а просто "cmd", если она в ~/.
0
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
03.05.2021, 16:31  [ТС]
Попробовал запустить с полным путем, но тоже не получилось: ./home/user/myapp.elf
Получилось тогда, когда я в одной команде объединил две: "cd /home/user; ./myapp.elf"
Ура. Интересна причина такого поведения...
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
03.05.2021, 16:34
Цитата Сообщение от sitesv Посмотреть сообщение
Попробовал запустить с полным путем, но тоже не получилось: ./home/user/myapp.elf
Неправильно.
Точку зачем в начале поставили? Точка - это путь от текущего каталога.
Должно быть так:
Bash
1
/home/user/myapp.elf
1
27 / 25 / 5
Регистрация: 22.04.2010
Сообщений: 772
03.05.2021, 16:40  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Точку зачем в начале поставили? Точка - это путь от текущего каталога.
Век живи - век учись (с)
Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.05.2021, 16:40
Помогаю со студенческими работами здесь

Подскажите как в aps запустить удаленно другую страницу
Есть asp приложение в котором необходимо запусть по URL другое asp приложение и получить в переменную из него хотябы в виде текста уже...

Как удалённо запустить командный файл на Windows Server 2008?
Всем здравствуйте! Подскажите, как мне с Linux запустить батник на указанной в теме ОС? Заранее благодарен!

Подскажите, как удалённо, через putty, запустить скрипт на выполнение
Сразу прошу простить,что пишу в этот топик,но вроде как подходит... есть роутер с openwrt, в нём лежит скрипт надо дать команду на...

Запись в бинарник и его чтение
Привет всем, задача состоит в том, что нужно записать в бинарник сведения о сканерах и считать их из него. Проблема в том что нужно в...

Как удаленно в домене открыть папку или запустить звуковой сигнал на другом компьютере(со своего компа)
Вообщем,я ещё только начинаю разбираться,не ругайтесь,мне нужно,что бы папка открывалась или звуковой сигнал запускался на другом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru