我按照link上的教程进行操作。一切正常,我可以在远程主机上执行命令。但是,当我尝试在与Zhone MXK 198(它是网络设备)的会话中调用ssh_channel_request_exec()函数时,我收到以下错误:
Writing packet: error on socket (or connection closed): Operation now in progress.
然而,我可以手动连接到该设备(使用openssh)。我认为这个错误与事实有关,MXK上的CLI与Linux中常见的CLI略有不同。例如,退格被解释为删除,因此键映射有问题。我假设我需要更改发送到套接字的数据格式。或许我错了?你能给我一些想法吗?
答案 0 :(得分:0)
我认为你的密钥代码没有到目前为止成为一个问题。从您提供的消息中,我怀疑您调用了异步函数,但将其视为同步,错误输出而不是等待。
假设我们有以下代码段:
n = recv(socket, buffer, sizeof buffer, 0);
if (n == -1) {
err(1, "Error receiving data from socket");
}
<work with the n bytes received on buffer>
对于大多数情况下的同步套接字来说,这是完全正常的,但是如果它是异步操作(你在标志上传递MSG_DONTWAIT,或者用fcntl / setsockopt设置O_NONBLOCK),你应该期望它返回-1 {{1} }作为错误号。
¹在实际应用程序中,您还应该处理EINTR(例如,该过程收到signal)。
在这种情况下,您正在接收EINPROGRESS,我们可以从中收集未完成的“失败”功能是connect()。见what are possible reason for socket error einprogress?
connect(2)手册页对此错误也非常明确:
EAGAIN
您可以使用ssh_set_blocking()将libssh更改为阻止,或者使用ssh_get_poll_flags()标记在套接字上使用select / poll。