如何使用:
# man 3 libnftables
const char *nft_ctx_get_output_buffer(struct nft_ctx *ctx);
我想保存 nftables 规则(不在控制台上打印)。但
nft_run_cmd_from_buffer
立即在控制台上打印规则。
这是我的示例代码:
#include <stdlib.h>
#include <nftables/libnftables.h>
int main(void)
{
struct nft_ctx *ctx;
int err;
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);
const char* output = nft_ctx_get_output_buffer(ctx);
err = nft_run_cmd_from_buffer(ctx, "list ruleset");
if (err < 0)
fprintf(stderr, "failed to run nftables command\n");
nft_ctx_free(ctx);
printf ("-----------------------------------------------------\n");
printf(">> %s\n",output);
return EXIT_SUCCESS;
}
谢谢,终于解决了问题:
根据手册页:
在最基本的层面上,必须分配一个新类型的对象 使用 nft_ctx_new() 函数构造 nft_ctx,然后通过 nft_run_cmd_from_buffer() 或 nft_run_cmd_from_filename() 函数。默认情况下,任何输出都会写入 stdout(或错误消息的 stderr)。这些文件 可以使用以下命令更改指针 nft_ctx_set_output() 和 nft_ctx_set_error() 函数。最重要的是,库可以缓冲任何输出 稍后检索作为静态缓冲区。 有关详细信息,请参阅 nft_ctx_buffer_output() 和 nft_ctx_buffer_error() 函数。
所以代码是:
#include <stdio.h>
#include <stdlib.h>
#include <nftables/libnftables.h>
int main() {
struct nft_ctx *ctx;
int err;
const char *output;
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_buffer_output(ctx);
err = nft_run_cmd_from_buffer(ctx, "list ruleset");
if (err < 0)
fprintf(stderr, "failed to run nftables command\n");
output = nft_ctx_get_output_buffer(ctx);
if (output != NULL) {
printf("Output: %s\n", output);
}
nft_ctx_free(ctx);
return EXIT_SUCCESS;
}