【发布时间】:2021-01-27 03:01:25
【问题描述】:
我正在使用 libssh,我想从执行的命令中获取一些输出。它在大多数情况下都有效,但我在输出中得到了不需要的字符。我做错了什么?
命令“test -f "/path/to/file" && echo found || echo not found”的示例输出
not found
t foun
我想要“未找到”,但不是它下面的行——“t foun”
我认为问题出在哪里:
nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
while (nbytes > 0)
{
output.append(buffer, sizeof(buffer));
nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
}
这是我的功能。
std::string exec_command(ssh_session session, const std::string& command)
{
ssh_channel channel;
int rc;
char* buffer;
std::string output;
int nbytes;
channel = ssh_channel_new(ssh_session);
if (channel == NULL)
return "Error";
rc = ssh_channel_open_session(channel);
if (rc != SSH_OK)
{
ssh_channel_free(channel);
return "Not Ok";
}
rc = ssh_channel_request_exec(channel, command.c_str());
if (rc != SSH_OK)
{
ssh_channel_close(channel);
ssh_channel_free(channel);
return "Not Ok";
}
nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
while (nbytes > 0)
{
output.append(buffer, sizeof(buffer));
nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
}
if (nbytes < 0)
{
ssh_channel_close(channel);
ssh_channel_free(channel);
return "Error";
}
ssh_channel_send_eof(channel);
ssh_channel_close(channel);
ssh_channel_free(channel);
return output;
}
【问题讨论】:
-
output.append(buffer, sizeof(buffer));->output.append(buffer, nbytes);。sizeof(buffer)将始终以字节为单位存储缓冲区的大小,即使读取返回的次数较少。您几乎总是会编写额外的垃圾,这些垃圾恰好仍在缓冲区中并且没有被覆盖。 -
提示:
sizeof(buffer)几乎总是错误的。在变量中跟踪缓冲区大小,当读入缓冲区时,注意实际读取了多少字节。 -
@ctrl_alt_del 好吧,经过一段不那么陡峭的学习曲线后,您至少会注意到,用它找到错误通常比在 Stack Overflow 上提问要快。
-
不要仅仅为了做一个受人尊敬的程序员而使用它。使用 if 是因为它作为编程生产力工具仅次于编译器。在大学期间,我仍然可以运行 Champions 活动的唯一原因是我很早就开始使用调试器。