用于将netstat输出附加到文件的Bash脚本?

时间:2015-02-28 08:27:59

标签: linux bash shell

在处理更高级的项目之前成为学习基础知识的忠实粉丝,我叹了口气,摇摇头问我这个问题...我喜欢实时监控传入/传出连接(netstat -natuec)但有时候我陷入了正在做的事情......所以我想创建一个脚本,将任何 NEW ip地址从netstat命令添加到txt文件以供日后查看。我不是要求一个简单的答案,只是一个线索,我将从哪里开始。谢谢!

2 个答案:

答案 0 :(得分:1)

不是bash而是perl,但它可以做你想要的,这是整个脚本:

use warnings;
use strict;
use Socket;
use feature 'say';

sub hex_to_ip {my $i = shift; inet_ntoa( pack( "N", hex( $i ) ) )}
sub addresses {open(my $net,"<","/proc/net/tcp"); my %add;while(<$net>) {my $r = (split " ",$_)[2];$r =~ s/(rem.*|:.*)//; $add{hex_to_ip($r)}++}; return %add};

my %old;
while(1) {
open(my $new_file,">>","/tmp/new_connections.txt");
my %fresh = &addresses;
for my $f(keys %fresh) {
    my $current_time = localtime;
    say $new_file "$f $current_time\n" unless exists $old{$f};
}
close $new_file;
say "!!"; %old = %fresh; sleep 2;
}

将十六进制转换为ip的函数

sub hex_to_ip {my $i = shift; inet_ntoa( pack( "N", hex( $i ) ) )} 

返回“/ proc / net / tcp”

中找到的所有远程地址
sub addresses {open(my $net,"<","/proc/net/tcp"); 
   my %add;while(<$net>) {my $r = (split " ",$_)[2];
   $r =~ s/(rem.*|:.*)//; $add{hex_to_ip($r)}++}; return %add
 } 

打开一个附加文件(不破坏其中的内容)

open(my $new_file,">>","/tmp/new_connections.txt"); 

运行程序的整个生命周期

while(1)

获取当前地址的新副本,如果$ old没有它们,则会使用时间戳写入文件。 (由于$ old在第一次尝试时没有填充,它将在第一次循环中写入所有地址)并且休眠两秒钟。

 my %fresh = &addresses;
for my $f(keys %fresh) {
    my $current_time = localtime;
    say $new_file "$f $current_time" unless exists $old{$f};
}
say "!!"; %old = %fresh; sleep 2;

}

答案 1 :(得分:0)

1.exec netstat&amp;获取IP地址
2.grep ip result.txt
3.如果没有ip,请写下这个,否则不要。

你可以用crontab来执行你的脚本。