Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1500071
  • 博文数量: 297
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 3082
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 11:36
文章分类

全部博文(297)

文章存档

2011年(1)

2009年(45)

2008年(67)

2007年(184)

我的朋友

分类:

2009-03-24 13:21:01

用Perl做了一个NetCat(nc)
Submitted by on 2008, October 29, 11:51 PM.

      这个机器有多古老?4.6-RELEASE FreeBSD,没有gcc,没有make,连系统都乱七八糟的,port都不好使,pkg_add -r安装包都会有问题,真是无语了,还好有安装了一个Perl 5.8.8。修理Port花了半天时间,硬是没搞好。想想也不划算,把紧急要用的一些小工具花一会儿功夫自己做一个出来算了,于是有了这个简单的perl版nc,不过我没支持-e参数,用不着。

  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use IO::Socket;
  5. use IO::Select;
  6. use Getopt::Std;
  7.  
  8. my %option;
  9. getopts('lp:', %option);
  10.  
  11. # listen on local port
  12. if( defined $option{'l'} )
  13. {
  14.     if( !defined $option{'p'} )
  15.     {
  16.         &Usage( );
  17.         exit( -1 );
  18.     }
  19.    
  20.     my $port = $option{'p'};
  21.     my $listen = IO::Socket::INET->new(Proto => 'tcp',
  22.                 LocalPort => $port,
  23.                 Listen => 1,
  24.                 Reuse => 1) or die "Listen on port $port error: $!n";
  25.  
  26.     while( my $client_sock = $listen->accept() )
  27.     {
  28.         &ProcessData( $client_sock );
  29.     }
  30. }
  31.  
  32. # if has no -l argument, maybe want to connect to other host
  33. if( @ARGV != 2 )
  34. {
  35.     &Usage( );
  36.     exit( -1 );
  37. }
  38.  
  39. my $client_sock = IO::Socket::INET->new(Proto => 'tcp', PeerHost => $ARGV[0], PeerPort => $ARGV[1] ) || die "Connect to $ARGV[0]:$ARGV[1] error:$!n";
  40. &ProcessData( $client_sock );
  41.  
  42. sub ProcessData
  43. {
  44.     my $client_sock = shift;
  45.    
  46.     my $select = IO::Select->new( );
  47.    
  48.     $select->add( *STDIN );
  49.     $select->add( $client_sock );
  50.    
  51.     my $buffer;
  52.     while( 1 )
  53.     {
  54.         if( ! $select->exists( $client_sock ) )
  55.         {
  56.             print "waiting connection....n";
  57.             last;
  58.         }
  59.        
  60.         my @ready = $select->can_read;
  61.        
  62.         for my $tmp_sock(@ready)
  63.         {
  64.             if( $tmp_sock eq *STDIN )
  65.             {
  66.                 if( my $recv_len = sysread( *STDIN, $buffer, 1024 )  )
  67.                 {
  68.                     if( ! syswrite($client_sock, $buffer) )
  69.                     {
  70.                         $select->remove( $client_sock );
  71.                         $select->remove( *STDIN );
  72.                         close( $client_sock );
  73.                        
  74.                         last;
  75.                     }
  76.                 }
  77.                 else
  78.                 {
  79.                     $select->remove( $client_sock );
  80.                     $select->remove( *STDIN );
  81.                     close( $client_sock );
  82.                        
  83.                     last;
  84.                 }
  85.             }
  86.            
  87.             elsif( $tmp_sock eq $client_sock )
  88.             {
  89.                 if( my $recv_len = sysread( $client_sock, $buffer, 1024*5 ) )
  90.                 {
  91.                     if( ! syswrite( *STDOUT, $buffer) )
  92.                     {
  93.                         $select->remove( $client_sock );
  94.                         $select->remove( *STDIN );
  95.                         close( $client_sock );
  96.                        
  97.                         last;
  98.                     }
  99.                 }
  100.                 else
  101.                 {
  102.                     print "socket disconnected.n";
  103.                     $select->remove( $client_sock );
  104.                     $select->remove( *STDIN );
  105.                     close( $client_sock );
  106.                        
  107.                     last;
  108.                 }
  109.             }
  110.         }
  111.     }
  112. }
  113.  
  114. sub Usage
  115. {
  116.     print "simple nc.pl, code by wustyunshu@hotmail.comn";
  117.     print "this script don't support -e cmd.exe, ^_^n";
  118.     print "Usage:n";
  119.     print "t  -l -p 99n";
  120.     print "t 192.168.0.1 80n";
  121. }
  122.  
阅读(748) | 评论(0) | 转发(0) |
0

上一篇:fsck 详解

下一篇:ssh 指南

给主人留下些什么吧!~~