Назад | Перейти на главную страницу

Синхронное обслуживание с netcat

Эта команда будет постоянно передавать свой вывод - все обращения с сегодняшнего дня на сервере apache - в браузер через netcat:

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

Это супер-круто, но меня беспокоит то, как это работает: команда grep запускается, а ее выходные данные бездействуют, пока кто-то не попросит об этом. Это имеет два значения:

  1. Невозможно использовать заголовки запроса, чтобы изменить то, что обслуживается
  2. Первый запрос дня всегда будет служить вчерашние результаты, так как вывод 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.