此命令将通过 netcat 持续向浏览器提供其输出(自今天起 Apache 服务器上的所有点击):
while true; do grep `date +%d\\/%b` /var/log/apache/access.log | nc -q1 -l -p8080; done
这真是太酷了,但我对它的工作方式有一点不满:grep 运行后,其输出处于休眠状态,直到有人要求它。这有两个含义:
- 无法利用请求标头来更改正在提供的内容
- 每天的第一个请求总是会被满足昨天的结果,因为 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
。