使用 netcat 同步服务

使用 netcat 同步服务

此命令将通过 netcat 持续向浏览器提供其输出(自今天起 Apache 服务器上的所有点击):

while true; do grep `date +%d\\/%b` /var/log/apache/access.log | nc -q1 -l -p8080; done

这真是太酷了,但我对它的工作方式有一点不满:grep 运行后,其输出处于休眠状态,直到有人要求它。这有两个含义:

  1. 无法利用请求标头来更改正在提供的内容
  2. 每天的第一个请求总是会被满足昨天的结果,因为 grep 输出自上次请求以来一直在那里。连续两次立即请求是确定您获得更新输出的唯一方法。

我的问题是:有没有解决的办法我模糊地知道如何使用mknod等等来制作反向管道,但经过一番认真的谷歌搜索和阅读手册页后,我真的无法弄清楚是否存在由于缺乏经验而没有看到的解决方案,或者我只是想做一些使用 unix 管道工作方式无法实现的事情。

编辑:我看到man nc开关-e可用于“执行指定的命令,使用来自网络的数据作为 stdin,并将 stdout 和 stderr 发送到网络。”它继续解释说,这只有在启用GAPING_SECURITY_HOLE(哈哈)编译时选项时才有效,这是有道理的。所以现在我想知道,这种极不安全的行为是我真正想要实现的吗,或者是否存在安全的中间立场?

也许只做 #2(上面)是安全的,但 #1 则不安全。目前还不确定。

编辑#2:可能与命名管道

答案1

使用 nc 如下:

while 1 ; do nc -e /usr/local/bin/myscript -l -p 8080 ; done

(使用 进行监控/usr/local/bin/myscript)是一种合理的方法。这GAPING_SECURITY_HOLE实际上只是关于有人使用它在您的机器上创建后门(nc -e /bin/bash -l -p 12345)。提示:如果他们在您的机器上,他们可能会找到其他方法来做到这一点。为了安全起见,请保留您的GAPING_SECURITY_HOLE副本/usr/local/bin/notnc或类似的东西。

其他答案,比如命名管道之类的,会很麻烦。下一个最简单的方法可能是编写一个小的python(您选择的语言)脚本来完成套接字工作。

答案2

与其尝试用一行代码完成这个任务(顺便说一句,这很酷),为什么不把它分成两个任务呢?在 00:01 运行一个 cron 任务,将日志数据拉到一个新文件中,然后根据请求将其传递给 netcat?

答案3

nc-c选择吗?在我看来轻微地比命令行更安全,-e因为命令就在nc命令行上,而不是在单独的脚本中。但是,通常的注意事项仍然适用。

while true; do nc -q1 -l -p8080 -c 'grep $(date +%d\\/%b) /var/log/apache/access.log'; done

man nc

    -c 字符串指定连接后要执行的 shell 命令(与  
                  注意)。该字符串被传递给 /bin/sh -c 进行执行。  
                  tion。如果你没有可用的  
                  /bin/sh (请注意,符合 POSIX 标准的系统必须有一个)。  

我的man页面没有提及GAPING_SECURITY_HOLE

相关内容