• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

用Perl做了一个NetCat(nc)[转]

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
     这个机器有多古老?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 [email protected]";
  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.  

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
perl教程(3)发布时间:2022-07-22
下一篇:
PerlUnicode全攻略发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap