如何通过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
相关产品推荐
相关产品推荐

