C++ C++;使用libssh libary通过SSH检索数据失败
我正在尝试从远程服务器获取命令“df”的输出,稍后将替换该命令:C++ C++;使用libssh libary通过SSH检索数据失败,c++,linux,gcc,libssh,C++,Linux,Gcc,Libssh,我正在尝试从远程服务器获取命令“df”的输出,稍后将替换该命令: #include <libssh/libssh.h> #include <stdlib.h> #include <stdio.h> int main() { ssh_session my_ssh_session; int rc; ssh_channel channel; char buffer[256]; int nbytes; int port
#include <libssh/libssh.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
ssh_session my_ssh_session;
int rc;
ssh_channel channel;
char buffer[256];
int nbytes;
int port = 22;
my_ssh_session = ssh_new();
if (my_ssh_session == NULL)
exit(-1);
ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, "192.168.2.2");
ssh_options_set(my_ssh_session, SSH_OPTIONS_PORT, &port);
rc = ssh_connect(my_ssh_session);
if (rc != SSH_OK)
{
fprintf(stderr, "Failed %s\n",
ssh_get_error(my_ssh_session));
exit(-1);
}
channel = ssh_channel_new(my_ssh_session);
if (channel == NULL)
return SSH_ERROR;
rc = ssh_channel_open_session(channel);
if (rc != SSH_OK)
{
ssh_channel_free(channel);
return rc;
}
rc = ssh_channel_request_exec(channel, "df");
if (rc != SSH_OK)
{
ssh_channel_close(channel);
ssh_channel_free(channel);
return rc;
}
nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
while (nbytes > 0)
{
if (write(1, buffer, nbytes) != nbytes)
{
ssh_channel_close(channel);
ssh_channel_free(channel);
return SSH_ERROR;
}
nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
}
if (nbytes < 0)
{
ssh_channel_close(channel);
ssh_channel_free(channel);
return SSH_ERROR;
}
ssh_channel_send_eof(channel);
ssh_channel_close(channel);
ssh_channel_free(channel);
return SSH_OK;
ssh_disconnect(my_ssh_session);
ssh_free(my_ssh_session);
}
#包括
#包括
#包括
int main()
{
ssh_会话我的ssh_会话;
int rc;
ssh_信道;
字符缓冲区[256];
整数字节;
int端口=22;
my_ssh_session=ssh_new();
if(my_ssh_session==NULL)
出口(-1);
ssh_选项集(我的ssh_会话,ssh_选项_主机,“192.168.2.2”);
ssh\u选项集(我的ssh\u会话、ssh\u选项\u端口和端口);
rc=ssh\u connect(我的ssh\u会话);
如果(rc!=SSH\u确定)
{
fprintf(标准,“失败的%s\n”,
ssh_获取_错误(我的ssh_会话));
出口(-1);
}
channel=ssh\u channel\u new(我的ssh\u会话);
如果(通道==NULL)
返回SSH_错误;
rc=ssh\u channel\u open\u会话(channel);
如果(rc!=SSH\u确定)
{
ssh_信道_空闲(信道);
返回rc;
}
rc=ssh\u channel\u request\u exec(通道,“df”);
如果(rc!=SSH\u确定)
{
ssh_通道_关闭(通道);
ssh_信道_空闲(信道);
返回rc;
}
nbytes=ssh\u channel\u read(通道,缓冲区,sizeof(缓冲区),0);
而(n字节>0)
{
if(写入(1,缓冲区,N字节)!=N字节)
{
ssh_通道_关闭(通道);
ssh_信道_空闲(信道);
返回SSH_错误;
}
nbytes=ssh\u channel\u read(通道,缓冲区,sizeof(缓冲区),0);
}
如果(n字节<0)
{
ssh_通道_关闭(通道);
ssh_信道_空闲(信道);
返回SSH_错误;
}
ssh_信道_发送_eof(信道);
ssh_通道_关闭(通道);
ssh_信道_空闲(信道);
返回SSH_OK;
ssh\u断开连接(我的ssh\u会话);
ssh_free(我的ssh_会话);
}
编译器没有显示任何错误,
但我运行程序时没有结果,
我检查了远程服务器的系统日志,发现以下行:
sshd[12794]:调度协议错误:类型90 seq 3
请告知可能出现的问题
谢谢。您似乎试图在没有主机身份验证功能(例如,通过公钥或密码检查来自/.ssh/known_hosts的信息)和用户身份验证A的情况下访问远程服务器。您应该将这两个函数放在
if (rc != SSH_OK)
{
fprintf(stderr, "Failed %s\n", ssh_get_error(my_ssh_session));
exit(-1);
}
查看中的第1章和第2章。上面是否有一行写着“来自…的失败密码?”程序返回什么exitcode?你可以用$找到答案吗?在运行它之后,在您的shell中。此外,使用调试器单步执行将显示它退出的位置。不,只需我提到的那一行和另一行表示连接已关闭,我将检查调试器。