Serviço síncrono com netcat

1

Este comando servirá persistentemente sua saída - todos os hits de hoje em um servidor apache - para um navegador, via netcat:

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

Isso é super legal, mas eu tenho um problema com o jeito que funciona: o grep é executado, e sua saída fica dormente até que alguém peça por ele. Isso tem duas implicações:

  1. Não há como usar os cabeçalhos de solicitação para alterar o que está sendo veiculado
  2. A primeira requisição do dia sempre servirá os resultados de ontem , já que a saída do grep está lá desde a última requisição. Duas solicitações imediatas seguidas são a única maneira de saber com certeza que você está recebendo uma saída atualizada.

A minha pergunta é: Existe alguma forma de contornar este ? Eu estou vagamente ciente da criação de backpipes com mknod e assim por diante, mas depois de algumas pesquisas no Google e leitura de manual, eu realmente não consigo descobrir se há uma solução que não estou vendo devido à falta de experiência, ou se eu estou simplesmente tentando fazer algo que não é viável com a maneira como os pipes unix funcionam.

Editar : vejo em man nc que a opção -e pode ser usada para "Executar o comando especificado, usando dados da rede para stdin e enviando stdout e stderr para a rede " Ele continua explicando que isso só funciona se a opção GAPING_SECURITY_HOLE (lol) de tempo de compilação estiver ativada, o que faz sentido. Então, agora eu estou querendo saber, este comportamento extremamente inseguro é o que eu estou realmente tentando realizar, ou existe um meio termo seguro?

Talvez fazer apenas o número 2 (acima) seja seguro, mas o número 1 não. Ainda não tenho certeza.

Editar # 2 : Talvez algo a ver com pipes nomeados ?

    
por Max Cantor 30.10.2009 / 21:25

3 respostas

1

Usando nc algo assim:

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

(Com seu monitoramento em /usr/local/bin/myscript ) é uma maneira razoável de fazer isso. O GAPING_SECURITY_HOLE bit é realmente apenas sobre alguém usá-lo para fazer um backdoor em sua máquina ( nc -e /bin/bash -l -p 12345 ). Dica: se eles estiverem na sua máquina, eles provavelmente descobrirão outra maneira de fazer isso. Para um pouco de segurança, mantenha sua cópia GAPING_SECURITY_HOLE em /usr/local/bin/notnc ou algo assim.

As outras respostas, com pipes nomeados e outras coisas, serão dolorosas. O próximo mais fácil é provavelmente escrever um pequeno script python (sua linguagem de escolha) para fazer o trabalho de soquete.

    
por 30.10.2009 / 22:12
0

Em vez de tentar e realizar isso em uma linha (muito legal btw), por que não dividir isso em duas tarefas? Executar um cron job às 00:01 para puxar seus dados de log para um novo arquivo que é então passado para o netcat mediante solicitação?

    
por 30.10.2009 / 21:42
0

Seu nc tem a opção -c ? Parece-me ser um pouco mais seguro que -e , pois o comando está bem na linha de comando nc , em vez de em um script separado. No entanto, as advertências habituais ainda se aplicam.

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

De 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).  

Minha página man não faz menção a GAPING_SECURITY_HOLE .

    
por 30.10.2009 / 23:19

Tags