Туннельный ввод libssh - PullRequest
       26

Туннельный ввод libssh

0 голосов
/ 22 января 2019

Я создал свой собственный обратный туннель SSH, используя libssh, следуя инструкциям на http://api.libssh.org/master/libssh_tutorial.html и собрав воедино вещи из различных других примеров.Однако теперь все, что я получаю, - это клиент, возвращающий все, что введено через туннельное соединение.Я пытаюсь добраться до точки, где я могу выполнять команды через обратный туннель (например: ls -al).

Обратный туннель (инициируется на стороне клиента):

int reverse_loop(ssh_session session){
    ssh_channel channel;
    int rc; 
    int nbytes, nwritten;
    char buf[256];
    int port = 0;

    rc = ssh_channel_listen_forward(session, NULL, 43434, NULL); 

    if (rc != SSH_OK){
        fprintf(stderr, "Error opening remote port %s\n", ssh_get_error(session));
        return rc; 
    }   

    channel = ssh_channel_accept_forward(session, 60000, &port);
    if (channel == NULL){
        fprintf(stderr, "Error waiting for incoming connection: %s\n", ssh_get_error(session)); 
        return SSH_ERROR;
    }   

    while(1){
        printf("In loop\n");
        nbytes = ssh_channel_read(channel, buf, sizeof(buf), 0); 
        if (nbytes < 0){ 
            fprintf(stderr, "Error reading incoming data: %s\n", ssh_get_error(session));
            ssh_channel_send_eof(channel);
            ssh_channel_free(channel);
            return SSH_ERROR;
        }
        printf("read channel\n");



        if (nbytes > 0){ 
            nwritten = ssh_channel_write(channel, buf, nbytes);
            if (nwritten != nbytes){
                fprintf(stderr, "Error sending answer: %s\n", ssh_get_error(session));
                ssh_channel_send_eof(channel);
                ssh_channel_free(channel);                                                                            
                return SSH_ERROR;
            }
            printf("Wrote channel\n");
        }
        printf("sent answer!\n");
    }
    // close_channel
    ssh_channel_send_eof(channel);
    ssh_channel_free(channel);

    return SSH_OK;
}

При запуске запускается обратный сеанс.Итак, с SSH-сервера я могу запустить:

> nc localhost 43434
ls (this is what I sent)
ls (this is what I receive)
pwd (this is what I sent)
pwd (this is what I receive)

Затем на стороне клиента я вижу такой вывод:

In loop
read channel
Wrote channel
sent answer!
In loop

То, что я ищу, это фактические результатызапуска ls или pwd (или любой другой системной команды, которую вводит пользователь, а не эхо. Может кто-нибудь направить меня на шаг, который я пропустил, чтобы сделать это?

Спасибо!

...