【发布时间】:2018-01-12 04:02:39
【问题描述】:
我使用官方教程中的客户端代码进行直接和反向端口转发:http://api.libssh.org/master/libssh_tutor_forwarding.html
此代码在 Ubuntu 16.10 上将客户端连接到 OpenSSH 服务器时完美运行,即实现了直接和反向端口转发。
但是,请考虑用于反向端口转发 (web_server()) 的客户端代码,它使用以下调用:
ssh_channel_listen_forward()
ssh_channel_accept_forward()
使用我自己的 libssh 服务器,问题是客户端在调用 ssh_channel_accept_forward() 时超时并显示以下错误消息:
"No channel request of this type from server"
即等待1分钟后由如下客户端代码打印错误信息:
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;
}
如何在服务器端构造通道请求,使客户端不会在ssh_channel_forward_accept() 中超时并创建新的转发通道?我已经尝试了大多数 API 函数,但没有运气......
是否有特定的 API 函数用于发送此类频道请求?如果没有,如何完成请求频道的任务?
我在服务器端的代码如下所示,ssh_channel_listen_forward() 请求由以下回调函数捕获:
void global_request(ssh_session session, ssh_message message, void *userdata) {
#ifdef DEBUG
printf("[Debug] global_request()\n");
#endif
struct session_data_struct *session_data = (struct session_data_struct*) userdata;
ssh_message_global_request_reply_success(message, 8080);
const char *addr = ssh_message_global_request_address(message);
int port = ssh_message_global_request_port(message);
printf("Received global request: %s:%d\n", addr, port);
session_data->channel = ssh_channel_new(session);
ssh_channel ch = ssh_message_channel_request_channel(message);
if (ssh_channel_is_open(session_data->channel)) {
printf("Channel is open!\n");
}
}
但是,如前所述,服务器没有让客户端在对ssh_channel_accept_forward() 的调用中接受新的转发通道。
有什么想法吗?
【问题讨论】:
-
+ 1 用于询问实际上与编程或开发有关的 SSH 问题
标签: c linux networking network-programming libssh