C-libssh和sftp-客户端/服务器-创建sftp会话挂起

时间:2019-06-29 04:50:03

标签: c sftp libssh2 libssh

我使用libssh通过SSH实现了客户端/服务器通信。我还想立即实现从客户端到服务器的文件上传,并一直遵循doc进行操作。

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

1 个答案:

答案 0 :(得分: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...
         }
    }
}