You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过libnftables保存nftables规则且不输出到控制台

解决libnftables命令输出不打印到控制台并保存到缓冲区的问题

你遇到的问题是nft_run_cmd_from_buffer默认会将输出打印到控制台,而非存入nft_ctx_get_output_buffer获取的缓冲区。这是因为libnftables默认输出目标为标准输出(stdout),需手动配置让输出转向内部缓冲区。

解决步骤

要让命令输出存入缓冲区,需调用nft_ctx_output_set_buffer函数指定输出缓冲区的地址和大小。以下是修改后的可用代码:

#include <stdlib.h>
#include <string.h>
#include <nftables/libnftables.h>

#define BUFFER_SIZE 4096

int main(void)
{
    struct nft_ctx *ctx;
    int err;
    char output_buf[BUFFER_SIZE];
    memset(output_buf, 0, BUFFER_SIZE);

    ctx = nft_ctx_new(0);
    if (!ctx) {
        perror("cannot allocate nft context");
        return EXIT_FAILURE;
    }

    // 设置输出格式标志
    nft_ctx_output_set_flags(ctx, NFT_CTX_OUTPUT_HANDLE | NFT_CTX_OUTPUT_JSON);
    // 配置输出到自定义缓冲区
    nft_ctx_output_set_buffer(ctx, output_buf, BUFFER_SIZE - 1, 0);

    err = nft_run_cmd_from_buffer(ctx, "list ruleset");
    if (err < 0) {
        fprintf(stderr, "failed to run nftables command\n");
        nft_ctx_free(ctx);
        return EXIT_FAILURE;
    }

    nft_ctx_free(ctx);

    printf("-----------------------------------------------------\n");
    printf(">>> %s\n", output_buf);
 
    return EXIT_SUCCESS;
}

关键说明

  • nft_ctx_output_set_buffer:该函数用于将libnftables的输出定向到你提供的缓冲区,参数依次为上下文指针、缓冲区地址、缓冲区最大可用大小(留1字节给终止符)、标志(0表示默认行为)。
  • 缓冲区需提前分配并初始化,确保有足够空间存储规则输出;若规则较多,可适当增大BUFFER_SIZE。
  • 执行nft_run_cmd_from_buffer后,输出内容会直接写入指定缓冲区,不再打印到控制台。

内容的提问来源于stack exchange,提问作者mah454

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 18:22:11