Ejecutando tcpdump, tee y scp

Estoy tratando de ejecutar lo siguiente:

$ tcpdump -l -X -i eth1 -n tcp port <port> | tee capture.txt | \ scp capture.txt root@10.3.3.227:/home/checker/ 
  1. tcpdump -l -X -i eth1 -n tcp port <port>

    En el paso # 1, estoy capturando packages, usando "-l" para hacer un buffer de línea estándar, para que escriba cada package a medida que llega.

  2. tee capture.txt

    En el paso n. ° 2 del man tee : "La utilidad T copy la input estándar a la salida estándar, haciendo una copy en cero o más files". La salida está sin búfer.

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

    En el paso # 3, envío el file capture.txt a un host remoto.

El problema

Si simplemente realizo los pasos 1 y 2, TODOS los packages se capturan en el puerto especificado. Sin embargo, si también uso el paso 3, capture.tx t NO contiene todos los packages (solo unos pocos) … Esto me está matando porque hace unos minutos estaba funcionando bien.

¿Que esta mal aquí?

El command tee escribe datos en el file de salida tal como lo recibe, pero scp copy el file inmediatamente y solo lo copy una vez. Como cada command en la tubería se ejecuta simultáneamente (o casi), solo obtendrá unos pocos (o ningún) package de salida en el file capture.txt antes de que el file se copie mediante scp .

Hay un par de maneras de hacer lo que parezca querer hacer.

Si desea copyr algunos packages de tcpdump y luego transferir el file al host remoto una vez que finaliza, puede usar la opción -c para terminar tcpdump luego de que capture esa cantidad de packages. Separe su command scp de la tubería utilizando un punto y coma para que se ejecute después de completar los commands tcpdump y tee :

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

O bien, si desea ver packages en time real y también copyrlos en time real, puede usar tee para enviar los packages a / dev / tty para que pueda verlos, y los canalice en un command ssh que los escriba en un file en el host remoto:

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

Tenga en count que sin la opción -c aquí, tcpdump se ejecutará hasta que lo mate.

Si quería los packages almacenados en un file local capture.txt así como también en el control remoto, podría usar múltiples commands en tee :

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

No se garantiza que el equipo haya terminado de escribir capture.txt cuando scp lo lea. Lo que podrías hacer es usar el stdout de tee y canalizarlo a través de ssh así:

 tcpdump -l -X -i eth1 -n tcp port <port> | tee capture.txt | \ ssh root@10.3.3.227 'cat > /home/checker/capture.txt' 

Creo que el problema aquí es que el file que estás copyndo a través de scp se copy en un momento en el time y no continuamente, por lo que terminas con un fragment del contenido de ese file en el server 10.3.3.227.

Pruebe esto en su lugar:

 $ sudo tcpdump -l -X -i eth1 -n <tcp port> | tee capture.txt | \ ssh root@10.3.3.227 'cat > /home/checker/capture.txt