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

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

01.05.2021, 17:02. Показов 10438. Ответов 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
364 / 218 / 53
Регистрация: 18.10.2017
Сообщений: 2,350
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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
364 / 218 / 53
Регистрация: 18.10.2017
Сообщений: 2,350
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
364 / 218 / 53
Регистрация: 18.10.2017
Сообщений: 2,350
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
364 / 218 / 53
Регистрация: 18.10.2017
Сообщений: 2,350
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
364 / 218 / 53
Регистрация: 18.10.2017
Сообщений: 2,350
03.05.2021, 08:02
У ssh могут быть свои особенности. Например, как я недавно говорил в одной своей теме,
при автоматическом запуске ей потребовалось имитировать терминал с помощью опций "-t -t".
Попробуйте запускать не через "./", а с полным путём. Но я бы удовлетворился помещением в ~/bin.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
03.05.2021, 13:50
Цитата Сообщение от sitesv Посмотреть сообщение
Кто-нибудь может объяснить в чем разница?
Скорее всего текущий каталог (то, что вы указываете через ./) не соответствует тому, где на самом деле лежала ваша программа.

Добавлено через 36 секунд
Попробуйте не класть программу в bin, а использовать полный путь при запуске.
0
 Аватар для peter_irich
364 / 218 / 53
Регистрация: 18.10.2017
Сообщений: 2,350
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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru