c - C - libssh 和 sftp - 客户端/服务器 - 创建 sftp 会话挂起
问题描述
我使用 libssh 通过 SSH 实现了客户端/服务器通信。我现在也想实现从客户端到服务器的文件上传,并且一直在关注它的文档。
但是,它挂在通话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 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...
}
}
}
推荐阅读
- angular - 离子按钮单击上的事件 preventDefault 不起作用
- python - 创建具有 N 个总和为常数 (C) 的随机数的类泊松分布
- css - - 观看 package.json 不起作用
- c++ - 使用 brm 函数但遇到“Compiling the C++ model No C++ compiler found ...”
- c++ - 函数 stoi 抛出一个 SIGBART 错误
- scala - 在 Slick 中按日期时间排序
- python - Python 从 Arduino 读取 IMU 数据并打印
- php - 如何单击此提交按钮并让它显示原始查询中的数据,而不是清除它并转到空白页面?
- python - QtDesigner Pyqt / Pyside 默认禁用可翻译
- ios - 在 Swift 中将完成处理程序分配给闭包变量