Executando o tcpdump, tee e scp

3

Estou tentando executar o seguinte:

$ tcpdump -l -X -i eth1 -n tcp port <port> | tee capture.txt | \
       scp capture.txt  [email protected]:/home/checker/
  1. tcpdump -l -X -i eth1 -n tcp port <port>

    Na etapa 1, estou capturando pacotes, usando "-l" para tornar padrão o buffer de linha, para que ele grave cada pacote quando chegar.

  2. tee capture.txt

    Na etapa # 2 man tee : "O utilitário tee copia a entrada padrão para a saída padrão, fazendo uma cópia em zero ou mais arquivos." A saída está sem buffer.

  3. scp capture.txt root@<remote-IP>:/home/

    Na etapa 3, envio o arquivo capture.txt para um host remoto.

O problema

Se eu simplesmente executar as etapas 1 e 2, TODOS os pacotes serão capturados na porta especificada. No entanto, se eu também usar o passo # 3, o capture.tx t NÃO contém todos os pacotes (apenas alguns) ... Isso está me matando porque eu tive esta execução OK há apenas alguns minutos atrás!

O que está errado aqui?

    
por bulkmoustache 23.10.2013 / 23:25

3 respostas

4

O comando tee grava dados no arquivo de saída à medida que o recebe, mas scp copia o arquivo imediatamente e copia-o apenas uma vez. Como cada comando no pipeline é executado simultaneamente (ou quase), você obtém apenas alguns (ou nenhum) pacote de saída para o arquivo capture.txt antes que o arquivo seja copiado por scp .

Existem algumas maneiras de fazer o que você parece querer fazer.

Se você quiser copiar alguns pacotes de tcpdump e, em seguida, transferir o arquivo para o host remoto após a conclusão, poderá usar a opção -c para finalizar tcpdump após capturar esse número de pacotes. Separe seu comando scp do pipeline usando um ponto e vírgula para que ele seja executado depois que os comandos tcpdump e tee forem concluídos:

tcpdump -l -c 10  | tee  /tmp/capture.txt; scp /tmp/capture.txt root@remotehost:/tmp

Ou, se você quiser ver os pacotes em tempo real e também copiá-los em tempo real, você pode usar tee para enviar os pacotes para / dev / tty para que possa vê-los e enviá-los para um% Comandossh que os grava em um arquivo no host remoto:

tcpdump -l   | tee /dev/tty | ssh root@remotehost "cat > /tmp/capture.txt"

Note que sem a opção -c aqui, o tcpdump será executado até que você o mate.

Se você quisesse os pacotes armazenados em um arquivo local capture.txt, bem como no controle remoto, você poderia usar vários comandos tee :

tcpdump -l   | tee /tmp/capture.txt | tee /dev/tty | ssh root@remotehost "cat > /tmp/capture.txt"
    
por 23.10.2013 / 23:49
3

Não é garantido que o tee tenha terminado de escrever o arquivo capture.txt quando o scp o lê. O que você poderia fazer é usar o stdout do tee e canalizá-lo através do ssh assim:

tcpdump -l -X -i eth1 -n tcp port <port> | tee capture.txt | \
  ssh [email protected] 'cat > /home/checker/capture.txt'
    
por 23.10.2013 / 23:40
2

Eu acho que o problema aqui é que o arquivo que você está copiando via scp é copiado em um momento e não continuamente, então você acaba com um fragmento do conteúdo desse arquivo no servidor 10.3.3.227.

Tente isso:

$ sudo tcpdump -l -X -i eth1 -n <tcp port> | tee capture.txt | \
    ssh [email protected] 'cat > /home/checker/capture.txt
    
por 23.10.2013 / 23:39