Как запустить команду tcpdump со скриптом? - PullRequest
0 голосов
/ 29 января 2020

Я устал пытаться найти ответ на этот вопрос. У меня есть 2 сценария, которые находятся в команде crontab -e.

START_TCPDUMP. sh

#!/bin/bash
tcpdump -i any port 3306 -s 65535 -x -nn -q -tttt> /etc/openvpn/logs/tcpdump_3306_"$(date +"%Y_%m_%d_%I_%M_%p")".out

STOP_TCPDUMP. sh

PID=$(/usr/bin/ps -ef | grep tcpdump | grep -v grep | grep -v ".sh" | awk '{print $2}')
/usr/bin/kill -9 $PID

CRONTAB -E

*/1 * * * * /etc/openvpn/script/STOP_TCPDUMP.sh
*/1 * * * * /etc/openvpn/script/START_TCPDUMP.sh

Я уже пытался изменить и поставить начало в первой строке, но все равно.

Мой вывод в каталог каждые 1 мин:

/etc/openvpn/logs/tcpdump_3306_2020_01_29_12_22_PM.out (empty: 0kb)

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

Также, если я запускаю: ps -e | grep tcpdump Я получаю 0 результатов. Но если я бегу: grep | tcpdump Я увидел, что команда работает и показывает все отслеживаемые пакеты ..

Я просто хочу, чтобы она работала как 3 часа, а затем остановилась, сохранила файл и запустила новый.

расписание раз в минуту - просто для отладки.

Ответы [ 2 ]

1 голос
/ 29 января 2020

Код kill каждого работающего tcpdump процесса в системе вызывает серьезные проблемы c. Вы хотите убить только тех, кто был запущен вашей cron работой. Никогда не используйте kill -9 регулярно; его следует использовать только в экстремальных условиях.

Множество бесполезных grep s также являются неприятным запахом и кажутся чрезвычайно хрупкими. Но давайте просто избавимся от этого кода.

Мое предложение будет иметь один сценарий, который убивает любой предыдущий экземпляр и запускает новый.

#!/bin/sh
logdir=/etc/openvpn/logs
exec >> "$logdir/cron.log" 2>&1

fmt="%Y_%m_%d_%I_%M_%p"
old=$(date -d "3 hours ago" +"$fmt")
new=$(date +"$fmt")

fuser -s -k -15 "$logdir/tcpdump_3306_$old.out"

tcpdump -i any port 3306 -s 65535 -x -nn -q -tttt>"$logdir/tcpdump_3306_$new.out"

Это позволяет перенаправить все сообщения в отдельный файл журнала (в противном случае cron отправит вам почту с выводом) и уничтожит только те процессы, которые прикреплены к предыдущему экземпляру выходного файла tcpdump. (Для тестирования, возможно, укажите "$logdir"/tcpdump*.out или даже "$logdir"/*, чтобы быть уверенным, что вы получите чистый лист.) Сигнал по умолчанию fuser равен -9; если вам это действительно нужно, просто возьмите -15.

fuser, который должен быть достаточно переносимым; date более привередливый, и не будет иметь опции -d на многих не Linux платформах. Вы всегда можете установить GNU Coreutils или переключиться на простой сценарий Perl или Python для расчета метки времени.

0 голосов
/ 29 января 2020

Я только что понял!

Я изменил свой метод. Я создаю экран в crontab, и он будет работать 24 часа в сутки 7 дней в неделю. Затем я просто ввожу файл, сохраняю информацию, затем очищаю файл, и он запускается автоматически.

crontab -e

@reboot screen -dmS bTCP; sleep 5; screen -S bTCP -X stuff 'tcpdump -i any port 22 -s 65535 -x -nn -q -tttt> /path/to/logs/NAME.out\n'
*/2 * * * * /path/to/logs/24-pt-query.sh

24-pt -query подает свой скрипт python, чтобы получить информацию, сохранить ее в новом файле и затем обрезать.

И это будет повторяться каждые 2 минуты (отладка).

...