我正在使用 ssh_channel_request_exec 在远程节点上执行命令“mkdir -p ~/.temp”。当 ssh_channel_request_exec 与 ssh_channel_read 一起使用时,目录的创建工作正常。另一方面,当不使用 ssh_channel_read 时,目录创建失败。
在这种情况下,ssh_channel_request_exec 不会向通道写入任何内容。那么,ssh_channel_read 这里有什么相关性呢?
int exec_result = ssh_channel_request_exec(channel, "mkdir -p ~/.temp");
if (exec_result != SSH_OK)
{
ssh_channel_close(channel);
ssh_channel_free(channel);
ssh_disconnect(session);
ssh_free(session);
return ;
}
在关闭通道之前,您需要允许命令完成。
ssh_channel_read
的副作用是它会延迟关闭通道。可能直到命令完成为止 - 所以到目前为止你可能很幸运,它延迟了足够长的关闭时间 - 比 mkdir
更长的运行命令可能仍然会失败。
如果您不想读取输出,您应该能够使用
ssh_channel_get_exit_status
来确定命令是否完成。
我不太了解 sshlib API,但一般来说,无论如何你都需要读取输出。因为如果您不这样做,并且该命令会生成足够的输出来填充输出缓冲区,则该命令将挂起。请参阅有关不同 SSH API 的这些问题: