c - 从 SSH 服务器发送 channel 请求,使 `ssh_channel_accept_forward()` 在 SSH 客户端上返回?

标签 c linux networking network-programming libssh

我使用官方教程中直接和反向端口转发的客户端代码: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/

相关文章:

c - C 中的多重引用和取消引用

java - 有没有办法找出移动网络连接的网关?

c - 为什么这段代码会打印同样的内容 5 次?

c - UNIX 编程、fork 分屏、exec 以及与管道通信

linux - 每个 Linux 终端中开头的 $ 是什么?

C++ 选项/长选项实现

javascript - 如何使用 knextjs 连接查询

linux - 在具有多个接口(interface)的服务器上接收多播 (linux)

c++ - 如何克隆载体?

c - 如何获取数字的最后n位?