我用libssh通过SSH实现了客户端/服务器通信。我也想立即实现从客户端上传到服务器的文件,并一直关注DOC。
但是,它挂在呼叫sftp = sftp_new(session);
上。我是否还必须在服务器端明确打开另一个SSH_CHANNEL?到目前为止,我仅在客户端上添加了SFTP代码。
对于所有挣扎的人,我终于找到了解决方案。
我在这个问题的线程上发现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 sftpn");
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: %sn", 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...
}
}
}