linux libnftables 导出规则

问题描述 投票:0回答:1

如何使用:

# 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;
}
c linux firewall nftables
1个回答
0
投票

谢谢,终于解决了问题:
根据手册页:

在最基本的层面上,必须分配一个新类型的对象 使用 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.