这个命令将通过netcat持久地将它的输出 – 从apache服务器的所有命中 – 到浏览器:
while true; do grep `date +%d\\/%b` /var/log/apache/access.log | nc -q1 -l -p8080; done
这是超级酷,但我有一个宠物与它的工作方式:grep运行,其输出坐在hibernate,直到有人要求它。 这有两个含义:
我的问题是: 有没有办法解决这个问题 ? 我很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 。