我使用官方教程中直接和反向端口转发的客户端代码: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;
}
如何在服务器端构建 channel 请求,以便客户端不会在 ssh_channel_forward_accept()
中超时并创建新的转发 channel ?我已经尝试了大部分 API 函数,但没有成功...
是否有特定的 API 函数用于发送此类 channel 请求?如果没有,我如何完成请求 channel 的任务?
我在服务器端的代码遵循以下几行,其中 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()
时接受新的转发 channel 。
有什么想法吗?
最佳答案
您的服务器代码不会向客户端发送打开反向隧道的请求。
此 channel :session_data->channel
创建未绑定(bind)在服务器端。您可以尝试连接它,但在这种情况下,您应该手动设置子类型 "forwarded-tcpip"
。
这个请求:ssh_message_channel_request_channel(message);
返回 NULL,因为端口转发请求没有 channel 字段。
对于反向隧道的启动,您可以使用 ssh_channel_accept_forward()
接受 - 您应该连接到服务器端的绑定(bind)监听端口。 (您知道 ssh_channel_listen_forward()
的端口号)。
附言并且不要使用服务器回调来接受这个请求。 Libssh 仍然从回调处理中过滤此消息子类型。
附言阅读 RFC ( https://www.rfc-editor.org/rfc/rfc4254#page-7) 和库源代码。它完全可读而且没有那么大
关于c - 从 SSH 服务器发送 channel 请求,使 `ssh_channel_accept_forward()` 在 SSH 客户端上返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45503010/