与netcat同步服务

这个命令将通过netcat持久地将它的输出 – 从apache服务器的所有命中 – 到浏览器:

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

这是超级酷,但我有一个宠物与它的工作方式:grep运行,其输出坐在hibernate,直到有人要求它。 这有两个含义:

  1. 没有办法使用请求头来改变服务
  2. 当天的第一个请求将始终服务于昨天的结果 ,因为自上次请求以来,grep输出已经在那里了。 连续的两个即时请求是唯一的方法来确定你正在得到更新的输出。

我的问题是: 有没有办法解决这个问题 ? 我很less意识到用mknod等手段制作背水pipe,但经过一些严重的谷歌search和手工阅读,我不能真正弄清楚是否有一个解决scheme,我没有看到由于缺乏经验,或者如果我只是试图做一些unixpipe道工作不可行的方法。

编辑 :我在man nc看到-e开关可以用来“执行指定的命令,使用stdin的networking数据,并发送stdout和stderr到networking。 它继续解释这只有在GAPING_SECURITY_HOLE (lol)编译时间选项被启用时才有效,这是有道理的。 所以现在我想知道,这是我实际上想要完成的非常不安全的行为,还是有一个安全的中间地带?

也许只做#2(以上)是安全的,但#1不会。 尚未确定。

编辑#2 :也许有一些与命名pipe道 ?

使用nc这样的东西:

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

(在/usr/local/bin/myscript监视)是一个合理的方法。 GAPING_SECURITY_HOLE位实际上就是有人用它来在你的机器上创build一个后门( nc -e /bin/bash -l -p 12345 )。 提示:如果他们在你的机器上,他们可能会找出一些其他的方式来做到这一点。 为了保持一点安全性,请将GAPING_SECURITY_HOLE副本保存在/usr/local/bin/notnc

其他答案,命名pipe道和东西,将是痛苦的。 接下来最简单的可能是编写一个小python (你select的语言)脚本来完成socket工作。

而不是试图完成这一行(很酷btw),为什么不把它分成两个任务? 在00:01运行cron作业,将日志数据导入一个新文件,然后根据请求传递给netcat。

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

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

man nc

  -cstring指定要连接后执行的shell命令(使用  
                  警告)。 string传递给/ bin / sh -c执行 -   
                  灰。 如果您没有工作,请参阅-e选项  
                   / bin / sh(注意符合POSIX的系统必须有一个)。  

我的man页没有提到GAPING_SECURITY_HOLE