【问题标题】:How can I run tcpdump command with a script?如何使用脚本运行 tcpdump 命令?
【发布时间】:2020-01-29 12:34:21
【问题描述】:

我厌倦了试图找到这个问题的答案。 我在 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 我看到命令正在运行并向我显示所有跟踪的包..

我只想让它像 3 小时一样运行,然后停止,保存文件,然后开始一个新文件。

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

【问题讨论】:

  • 当您有另一份工作几乎立即杀死它时,您如何期望它产生任何输出?无论如何,更好的方法是使用pkill,您的重新实现中通常会有 5-6 个错误。
  • 那应该如何?你能帮我做吗?
  • 不清楚你想要完成什么。你为什么要立即杀死这份工作?你没有pkill 实用程序,或者至少没有pgrep?
  • 我只想让它像运行 3 小时然后停止,保存文件然后开始一个新文件
  • 如果你想让它运行一分钟,你可以在前一分钟的文件上使用fuser -k。如果您有 GNU date,那么使用 -d "1 minute ago" 应该很容易获得前一分钟;如果没有,这将更具挑战性(也许可以尝试 Awk、Perl 或 Python)。

标签: shell cron tcpdump


【解决方案1】:

系统上每个运行tcpdump 进程的kill 代码存在严重问题。您只想杀死由您的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 脚本来计算时间戳。

【讨论】:

    【解决方案2】:

    我刚刚想通了!

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

    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 分钟重复一次(调试中)。

    【讨论】:

      猜你喜欢
      • 2015-12-19
      • 2018-02-05
      • 2020-11-28
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多