Я создал свой собственный обратный туннель 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
(или любой другой системной команды, которую вводит пользователь, а не эхо. Может кто-нибудь направить меня на шаг, который я пропустил, чтобы сделать это?
Спасибо!