【问题标题】:C++: Unwanted Character in OutputC++:输出中不需要的字符
【发布时间】: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 活动的唯一原因是我很早就开始使用调试器。

标签: c++ libssh


【解决方案1】:

sizeof(buffer) 表示 sizeof(char*) 可能是 4 个字节。在ssh_channel_read 第三个参数(计数)是你的缓冲区的限制。不是缓冲区中加载的元素数量。您将其作为返回值。所以首先,你需要为你的缓冲区分配一些内存,比如说 256 字节:

const int BUFFER_SIZE = 256;
char buffer[BUFFER_SIZE];

现在您可以将缓冲区大小作为参数传递并填充缓冲区:

nbytes = ssh_channel_read(channel, buffer, BUFFER_SIZE, 0);
while (nbytes > 0)
{
    output.append(buffer, nbytes);
    nbytes = ssh_channel_read(channel, buffer, BUFFER_SIZE, 0);
}

并且您需要添加尽可能多的内容,即nbytes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    相关资源
    最近更新 更多