- 论坛徽章:
- 3
|
这个脚本运用了线程、信号量、线程队列、进度条等。
主要是工作项目需要,写的。有的地方是论坛的童鞋指导了下。
目前好像还有BUG,但是目前没时间改了。有兴趣的自己改改,发出来,共同学习。{:3_188:}
PS:@laputa73 这个就是之前请教你部分地方的那个扫描脚本。发出来了。。- #!/usr/bin/perl
- use threads;
- use DBI;
- use Thread::Queue;
- use Thread::Semaphore;
- use Net::Ping;
- use Term::ProgressBar;
- # create queue
- my $q=new Thread::Queue;
- # read for check list
- my @target=<>;
- my $se_max = Thread::Semaphore->new( 100 );
- my $se_ping= Thread::Semaphore->new( 1000 );
- foreach (@target){
- chomp($_);
- if(${$se_ping} <=0){
- for my $t(threads->list(threads::joinable)){
- $t->join();
- $se_ping->up();
- }
- redo;
- }
- $se_ping->down();
- threads->create(\&alive,$_);
- }
- for my $t(threads->list()){
- $t->join();
- }
- sub alive{
- my $ip =shift;
- $ping=Net::Ping->new();
- if($ping->ping($ip)){
- foreach my $port(1..65535){
- $q->enqueue("$ip|$port");
- }
- }
- }
- $all_sum=$q->pending();
- print $all_sum;
- my $progress = Term::ProgressBar->new({name => '扫描进度',count => $all_sum});
- $progress->max_update_rate(1);
- while(1){
- foreach(threads->list(threads::joinable))
- {
- $_->join();
- }
- my $item = $q->pending();
- if( $item == 0 )
- {
- my $active = threads->list(threads::running);
- if($active == 0)
- {
- print "全部跑完\n";
- last;
- }
- else
- {
- next;
- }
- }
- $se_max->down;
- threads->create(\&nex,$q->dequeue());
- $progress->update()
- }
- foreach(threads->list()){
- $_->join();
- }
- print "\n";
- sub nex{
- local($tmp)=shift;
- @list=split(/\|/,$tmp);
- my $scan = Net::Ping->new("syn");
- $scan->port_number($list[1]);
- $scan->ping($list[0]);
- if($scan->ack){
- db_insert($list[0],$list[1]);
- }
- $scan->close();
- $se_max->up;
- }
- sub db_insert{
- my $host=shift;
- my $port=shift;
- my $in=DBI->connect("DBI:mysql:database=port_scan;host=localhost","root","") or die "NO :$!";
- my $insert=$in->do("insert into result(ip,port)values('$host',$port)");
- $in->disconnect();
- }
复制代码 |
|