免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4568 | 回复: 16
打印 上一主题 下一主题

Perl的IO可以直接重定向到Socket么? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-30 19:51 |只看该作者 |倒序浏览
20可用积分
要求实现一个远程执行命令的C/S程序,服务端监听端口,客户端连接上后发送一个可执行命令,服务端接受连接并fork一个进程exec该命令,由于命令的输出要返回给客户端因此希望能够将fork出子进程的STDOUT和STDERR能够直接重定向到Socket,这样当程序执行时输出直接发送到远端显示,Perl中能否实现该功能?pipe可以么?

或者是否有其他好的替代方案?

[ 本帖最后由 phrack2561 于 2009-6-30 21:25 编辑 ]

最佳答案

查看完整内容

或者用Socket.pm参见 http://packetstormsecurity.org/groups/synnergy/bindshell-unix

论坛徽章:
0
2 [报告]
发表于 2009-06-30 19:51 |只看该作者


  1. #!/usr/bin/perl

  2. use IO::Socket::INET;

  3. my $port = 1234;

  4. my $srv = IO::Socket::INET->new(
  5.     LocalHost => '127.0.0.1',
  6.     LocalPort => $port,
  7.     ReuseAddr => 1,
  8.     Listen => 10,
  9.     Proto => 'tcp',
  10.     ) or die "$!";



  11. while(my $cli = $srv->accept()) {

  12.     my $pid = fork();

  13.     if ($pid < 0) {
  14.         die "fork:$!";
  15.     }elsif($pid > 0) {
  16.         close $cli;
  17.     }else {
  18.         close $srv;
  19.         while(my $str = <$cli>) {
  20.             exit 0 if ($str=~/quit/i);
  21.             chomp $str;

  22.             close(STDOUT);
  23.             open(CMD, "$str |") or die "$!";
  24.             $| = 1;
  25.             while(<CMD>) {
  26.                 print $cli $_;
  27.             }
  28.             close CMD;
  29.         }
  30.     }
  31. }

复制代码



或者用Socket.pm

参见 http://packetstormsecurity.org/groups/synnergy/bindshell-unix

论坛徽章:
0
3 [报告]
发表于 2009-06-30 20:23 |只看该作者
可以,
和其他语言没什么大区别 -_-

简单的命令就不用fork, 直接把命令输出print/write到socket, 复杂的耗时长的可以用pipe+select 或者fork+dup之类的做法

论坛徽章:
0
4 [报告]
发表于 2009-06-30 20:46 |只看该作者
显然可以。

论坛徽章:
0
5 [报告]
发表于 2009-06-30 21:04 |只看该作者
给个例子哈,各位老大~~~
下面是部分代码

     # 产生子进程处理
     my $pid = fork();
        if( $pid < 0 )
        { # fork err
            printDate "Fork failed. Close socket.";
            close( $cltSock );
        }
        elsif( $pid )
        { # father proc
            # echo pid no to client
            printDate "Create PID[$pid] to Proc Socket[".fileno( $cltSock )."].";
            print $cltSock "#pidpid\n";
        }
        else
        { # child proc
             #### 想在这个地方做重定向 #######
             # 比如select($cltSock)   --- 显然这个不工作
             exec @cmditems;  
        }

论坛徽章:
0
6 [报告]
发表于 2009-06-30 21:16 |只看该作者
我是想用最简单的方式实现该功能,就是把STDOUT输出直接连接到socket句柄,然后不用额外处理当exec执行程序产生输出时直接发送到socket,同一时间可能会执行上百条指令,因此同时可能存在上百个子进程。

论坛徽章:
0
7 [报告]
发表于 2009-06-30 21:40 |只看该作者
信誉积分是啥?我怎么就没有呢?

  open(CMD,"$cmd |");
  while(my $cmdre=<CMD>)
  {
     chomp $cmdre;
     print $sock "$cmdre\n";
  }


或者  print $sock `$cmd`

[ 本帖最后由 xti9er 于 2009-6-30 21:43 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2009-06-30 21:41 |只看该作者
"# 比如select($cltSock)   --- 显然这个不工作"

为什么不工作呢?

论坛徽章:
0
9 [报告]
发表于 2009-06-30 22:11 |只看该作者
可以写个测试代码试一下啊,我测试的结果是exec执行所产生的输出client端是没有收到的

论坛徽章:
0
10 [报告]
发表于 2009-06-30 22:19 |只看该作者
OK,一个简单的测试

my $fd = new FileHandle( "> AAA" );

select $fd;
exec("ls");

可以发现ls产生的结果还是到屏幕上了

open(STDOUT, "> AAA");
exec("ls");
这样倒是可以,但是我能用  open(STDOUT, " >&$cltSock")么, 似乎是行不通的。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP