用于在 Linux 上捕获 tcpdump 跟踪的 Perl 脚本
Perl script to capture tcpdump traces on Linux
您好,我写了一个脚本,之前使用 'snoop' 命令运行良好。此脚本在脚本中派生 child 以启动 tcpdump。当我不得不停止转储时,我杀死了 child,但是当我查看 wireshark 中生成的 pcap 时,它显示错误 "The capture file appears to have been cut short in the middle of a packet"。我的命令是
my $snoopAPP = &startService("tcpdump -w /tmp/app.pcap -i bond0>/dev/null 2>&1" , '');
kill 9, -$snoopAPP;waitpid $snoopAPP, 0;
sub startService(){
#runs a program in background and returns PID which can be used later to kill the process
#arguments are 1, path , 2nd the name of the file
my $processPath = $_[0];chomp($processPath);
if ($_[1] ne ''){$processPath = $processPath . " >$path/$_[1].log";}
print "\nStarting ... \n-- $processPath\n";
my $pid = fork();
die "unable to fork $processPath: $!" unless defined($pid);
if (!$pid) { # child
setpgrp(0, 0);
exec("$processPath");
die "\nunable to exec: $!\n";
exit;
}
print " ---- PID: $pid\n";
return $pid;
}
另一个 post 建议等待 tcpdump 退出,我已经这样做了,但它仍然会导致相同的错误消息。
尝试
kill 15, -$snoopAPP
信号 9,SIGKILL,是一个立即终止,不给应用程序完成的机会,所以,好吧,捕获文件很有可能在数据包中间被截断。
信号 15,SIGTERM,可以被应用程序捕获,因此它可以在终止之前进行清理。 Tcpdump 捕获它并完成写出缓冲输出。
您好,我写了一个脚本,之前使用 'snoop' 命令运行良好。此脚本在脚本中派生 child 以启动 tcpdump。当我不得不停止转储时,我杀死了 child,但是当我查看 wireshark 中生成的 pcap 时,它显示错误 "The capture file appears to have been cut short in the middle of a packet"。我的命令是
my $snoopAPP = &startService("tcpdump -w /tmp/app.pcap -i bond0>/dev/null 2>&1" , '');
kill 9, -$snoopAPP;waitpid $snoopAPP, 0;
sub startService(){
#runs a program in background and returns PID which can be used later to kill the process
#arguments are 1, path , 2nd the name of the file
my $processPath = $_[0];chomp($processPath);
if ($_[1] ne ''){$processPath = $processPath . " >$path/$_[1].log";}
print "\nStarting ... \n-- $processPath\n";
my $pid = fork();
die "unable to fork $processPath: $!" unless defined($pid);
if (!$pid) { # child
setpgrp(0, 0);
exec("$processPath");
die "\nunable to exec: $!\n";
exit;
}
print " ---- PID: $pid\n";
return $pid;
}
另一个 post 建议等待 tcpdump 退出,我已经这样做了,但它仍然会导致相同的错误消息。
尝试
kill 15, -$snoopAPP
信号 9,SIGKILL,是一个立即终止,不给应用程序完成的机会,所以,好吧,捕获文件很有可能在数据包中间被截断。
信号 15,SIGTERM,可以被应用程序捕获,因此它可以在终止之前进行清理。 Tcpdump 捕获它并完成写出缓冲输出。