【问题标题】:C - libssh and sftp - client/server - creating sftp session hangsC - libssh 和 sftp - 客户端/服务器 - 创建 sftp 会话挂起
【发布时间】:2019-07-01 15:23:09
【问题描述】:

我使用 libssh 通过 SSH 实现了客户端/服务器通信。我现在也想实现从客户端到服务器的文件上传,并一直在关注doc

但是,它在呼叫 sftp = sftp_new(session); 时挂起。我是否也必须在服务器端为其显式打开另一个 ssh_channel ?到目前为止,我只在客户端添加了 sftp 代码。

【问题讨论】:

  • 您提供的链接非常清楚“您不直接处理 SSH 通道”。请提供A Minimal, Complete, and Verifiable Example (MCVE)
  • 我理解客户端(或上传文件的人)不使用任何渠道的方式。但是我不知道在我启动了 ssh_session 和 ssh_channel 的服务器端该做什么。我是在那里创建另一个 sftp_session,还是打开另一个频道等。
  • sftp 通过 ssh 发生。从客户端到服务器的底层 ssh 连接处理对服务器的访问。如果你看几个例子,他们有一个例子,他们在服务器上创建一个文件。因此,与打开 TCP 连接需要在服务器上运行应用程序来监听连接不同,sshd 会为 sftp 处理。
  • libssh2 sftp examplelibssh/examples/samplesftp.c 应该会有所帮助。

标签: c sftp libssh2 libssh


【解决方案1】:

对于所有苦苦挣扎的人,我终于找到了解决方案。

我在this question 的线程上发现libssh/sftp.h 在最后确实为服务器提供了单独的功能。要启用它们,您必须使用#define WITH_SERVER

尽管文档上的评论说您不必自己处理频道,但您必须在服务器端打开一个新频道以进行 SFTP 通信。实现这个对我有用:

while ((msg = ssh_message_get(session)))
{

    if (ssh_message_type(msg) == SSH_REQUEST_CHANNEL_OPEN && ssh_message_subtype(msg) == SSH_CHANNEL_SESSION)
    {
        printf("[+] Got channel open request, opening new channel for sftp\n");
        sftpChannel = ssh_message_channel_request_open_reply_accept(msg);
        ssh_message_free(msg);
    }

    if (ssh_message_type(msg) == SSH_REQUEST_CHANNEL && ssh_message_subtype(msg) == SSH_CHANNEL_REQUEST_SUBSYSTEM)
    {
        if (!strcmp(ssh_message_channel_request_subsystem(msg), "sftp"))
        {
            ssh_message_channel_request_reply_success(msg);
            ssh_message_free(msg);

            // setup SFTP session
            sftp_session sftp = sftp_server_new(session, sftpChannel);
            if (sftp == NULL)
            {
                fprintf(stderr, "Error allocating SFTP session: %s\n", ssh_get_error(session));
            }                           
            int rc = sftp_server_init(sftp);
            if (rc != SSH_OK)
            {
               fprintf(stderr, "Error initializing SFTP session: %i.\n", sftp_get_error(sftp));
               sftp_free(sftp);
            }

            // handle communication...
         }
    }
}

【讨论】:

  • 如何避免请求被 OpenSSH SFTP 本身拦截?因为 Libssh 在端口 22 上使用 OpenSSH,所以所有请求都由 OpenSSH SFTP 而不是您的 Libssh SFTP 服务器处理。
猜你喜欢
  • 2013-05-06
  • 1970-01-01
  • 2022-06-16
  • 2018-05-19
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多