如何使用脚本运行tcpdump命令?

时间:2020-01-29 12:34:21

标签: shell cron tcpdump

我厌倦了试图找到答案。 我在crontab -e命令中有2个脚本。

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我看到命令正在运行,并向我显示了所有跟踪的软件包。

我只希望它像3h一样运行,然后停止,保存文件,然后开始一个新文件。

每分钟一次的计划仅用于调试。

2 个答案:

答案 0 :(得分:1)

在系统上每个kill运行中的进程tcpdump的代码都存在很大问题。您只想杀死cron工作开始的人。切勿常规使用kill -9;仅应在极端情况下使用。

多个useless greps也是难闻的气味,而且看起来非常脆。但是,让我们简单地删除该代码。

我的建议是只有一个脚本,该脚本可以杀死任何先前的实例并开始一个新的实例。

#!/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更挑剔,在许多非Linux平台上没有-d选项。您始终可以安装GNU Coreutils,或切换到简单的Perl或Python脚本进行时间戳计算。

答案 1 :(得分:0)

我只是想通了!

我更改了方法。我在crontab上创建了一个屏幕,它将每周每7天24小时运行一次。然后,我只输入文件,保存信息,然后清除文件,它将自动运行。

crontab -e

compute()

24点查询文件是一个python脚本,用于获取信息,将其保存在新文件中,然后截断它。

它将每2分钟重复一次(调试)。