Эта команда будет постоянно передавать свой вывод - все обращения с сегодняшнего дня на сервере apache - в браузер через netcat:
while true; do grep `date +%d\\/%b` /var/log/apache/access.log | nc -q1 -l -p8080; done
Это супер-круто, но меня беспокоит то, как это работает: команда grep запускается, а ее выходные данные бездействуют, пока кто-то не попросит об этом. Это имеет два значения:
У меня вопрос: Есть ли способ обойти это? Я смутно знаю, как создавать трубы с mknod
и так далее, но после серьезного поиска в Google и чтения man-страниц я не могу понять, есть ли решение, которое я не вижу из-за отсутствия опыта, или я просто пытаюсь сделать что-то, что не возможно с тем, как работают трубы unix.
редактировать: Я вижу в man nc
что -e
Переключатель может использоваться для «Выполнения указанной команды с использованием данных из сети для стандартного ввода и отправки стандартного вывода и вывода в сеть». Далее объясняется, что это работает, только если GAPING_SECURITY_HOLE
(lol) была включена опция времени компиляции, что имеет смысл. Итак, теперь мне интересно, действительно ли я пытаюсь достичь этого крайне небезопасного поведения, или есть безопасная золотая середина?
Возможно, выполнение только №2 (выше) было бы безопасным, но №1 - нет. Пока не уверен.
Редактировать # 2: Может быть, это связано с именованные каналы?
Используя nc примерно так:
while 1 ; do nc -e /usr/local/bin/myscript -l -p 8080 ; done
(С вашим мониторингом в /usr/local/bin/myscript
) - разумный способ сделать это. В GAPING_SECURITY_HOLE
bit на самом деле просто о том, что кто-то использует его для создания бэкдора на вашей машине (nc -e /bin/bash -l -p 12345
). Подсказка: если они установлены на вашем компьютере, они, вероятно, найдут другой способ сделать это. Для небольшой безопасности сохраните GAPING_SECURITY_HOLE
копировать в /usr/local/bin/notnc
или что-то.
Другие ответы, с именованными каналами и прочим, будут болезненными. Следующим по простоте будет, наверное, немного написать питон(выбранный вами язык) скрипт для работы сокета.
Вместо того, чтобы пытаться выполнить это одной строкой (очень круто, кстати), почему бы не разбить это на две задачи? Запустить задание cron в 00:01, чтобы вывести данные журнала в новый файл, который затем передается в 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
:
-c string specify shell commands to exec after connect (use with caution). The string is passed to /bin/sh -c for execu‐ tion. See the -e option if you don’t have a working /bin/sh (Note that POSIX-conformant system must have one).
Мой man
страница не упоминает о GAPING_SECURITY_HOLE
.