Запуск tcpdump, tee и scp

Я пытаюсь запустить следующее:

$ 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>

    На шаге №1 я захватываю пакеты, используя «-l», чтобы сделать стандартную строку с буферизацией строки, чтобы она записывала каждый пакет по мере его поступления.

  2. tee capture.txt

    На шаге №2: «Утилита tee копирует стандартный ввод в стандартный вывод, делая копию в ноль или более файлов». Выход небуферизован.

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

    На шаге №3 я отправляю файл capture.txt на удаленный хост.

Проблема

Если я просто выполняю шаги №1 и №2, ВСЕ пакеты будут записаны на указанном порту. Тем не менее, если я также использую шаг №3, capture.tx t НЕ содержит все пакеты (только несколько) … Это убивает меня, потому что у меня это работает ОК всего несколько минут назад!

Что здесь не так?

Команда tee записывает данные в выходной файл по мере его получения, но scp копирует файл немедленно и только копирует его один раз. Поскольку каждая команда в конвейере выполняется одновременно (или почти так), вы получаете только несколько (или нет) пакетов, выводящих в файл capture.txt, прежде чем файл будет скопирован scp .

Есть несколько способов сделать то, что вы, похоже, хотите сделать.

Если вы хотите скопировать несколько пакетов из tcpdump и затем перенести файл на удаленный хост после его завершения, вы можете использовать параметр -c для завершения tcpdump после того, как он зафиксирует это количество пакетов. Отделите свою команду scp от конвейера, используя полуточку, чтобы она выполнялась после завершения команд tcpdump и tee :

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

Или, если вы хотите видеть пакеты в режиме реального времени, а также копировать их в реальном времени, вы можете использовать tee для вывода пакетов в / dev / tty, чтобы вы могли их видеть, и они транслировали их в команду ssh которая записывает их в файл на удаленном хосте:

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

Обратите внимание, что без опции -c здесь tcpdump будет работать до тех пор, пока вы не убьете его.

Если вам нужны пакеты, хранящиеся в локальном файле capture.txt, а также удаленный, вы можете использовать несколько команд tee :

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

Не гарантируется, что tee закончил писать capture.txt, когда scp читает его. Что вы можете сделать, так это использовать stdout из tee и передать его через ssh следующим образом:

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

Я думаю, проблема в том, что файл, который вы копируете с помощью scp , копируется в момент времени и не постоянно, поэтому вы получаете фрагмент содержимого этого файла на сервере 10.3.3.227.

Попробуйте это вместо этого:

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