![通过管道将 BIND9 日志传输到 shell.php 脚本](https://linux22.com/image/1037445/%E9%80%9A%E8%BF%87%E7%AE%A1%E9%81%93%E5%B0%86%20BIND9%20%E6%97%A5%E5%BF%97%E4%BC%A0%E8%BE%93%E5%88%B0%20shell.php%20%E8%84%9A%E6%9C%AC.png)
我正在尝试从 BIND9 的查询日志中提取一些数据。我喜欢先将查询传送到脚本,然后对其进行解析,然后记录它。
我该怎么做?请帮忙。
日志记录 { 通道 simple_log { 文件 "/var/log/named/log.sh" 版本 10 大小 10m; <--- 可能吗? 打印时间 是; 打印严重性 是; 打印类别 是; }; 类别默认 { simple_log; }; 类别查询 { simple_log; }; };
答案1
您需要使用 fifo。这是一个“特殊”文件,实际上是一个套接字;当进程打开此特殊文件并对其进行读/写时,连接的其他进程将获得这些读/写的结果。
例如,BIND9 会配置为记录到 fifo,然后您的 PHP 脚本也会打开 fifo,并从中读取数据。每次 BIND9 执行写入操作时,PHP 都会返回读取操作。
参见man mkfifo
,但实质上:
mkfifo /var/log/named/log.fifo
让 BIND9 记录到该日志中(删除版本和大小参数,它们无法与 fifo 配合使用),然后 PHP 读取和解析它由您决定,但请记住,您像打开任何普通文件一样打开和读取它。读取将阻塞,直到有内容写入其中。
作为测试,您可以执行以下操作:
在 1 号航站楼:
mkfifo /tmp/test_fifo
cat /tmp/test_fifo
cat
由于尚无任何内容可读取,因此将阻塞。这是在模拟 PHP 从读取test_fifo
。
目前在 2 号航站楼:
echo foo >/tmp/test_fifo
观察终端 1 如何返回您的“foo”。这是在模拟 BIND9 写入某些内容。
当您完成 fifo 后,rm
它就像任何其他普通文件一样。