LINUX.ORG.RU

[perl] проброс проги в сокет

 


0

0

что надо, есть некая прога, консольная, которая не имеет сокетного интерфейса
для соединения через интернет.

Надо написать для неё оболочку, которая бы умела пробрасывать диалог
пользователя с программой через сокет, т.е. telnet 123.233.12.24 9000 
и ты пишешь команды в прогу, и она тебе возвращает значение как будто
ты на консоли работаешь.

Короче я это дело написал на сабже, но толи уже 5 утра и лыжи не едут,
 толи еще чего-то. Вобщем один раз оно логинится, но второй уже не 
хочет. Походу я чего то где то уже не вижу. Это можно обойти 
перезапуском сервера по отрубанию клента, но не хотелось бы. С зомбями
 все вроде бы ок, но гдето там чето застревает. 

#!/usr/bin/perl -w

use IPC::Open2;
use IO::Socket;
#use IPC::Shareable;
use strict;
my $PORT = 9000;
my ($pid1,$line,$server,$client);
$server = IO::Socket::INET->new( Proto     => 'tcp',
                                 LocalPort => $PORT,
                                 Listen    => SOMAXCONN,
                                 Reuse     => 1);
die "can't setup server $!" unless $server;
my $pid = open2(\*RD, \*WR, '/bin/bash') or die "cant open: $!\n";
while($client = $server->accept()){
  $client->autoflush(1);
  print "next client\n";
  my ($byte,$c,$rr);
  if ($pid1 = fork) {
    while (sysread($client, $byte, 1) == 1) {
      $c=1 if $byte=~m!.!sm;
      $rr.=$byte if $c==1;
      do{
        $c=0; $rr=~s!(.*)[\r|\n|\cM|\cJ]$!$1\n!;
        print $rr; #print "\\r" if $rr=~m!\n$!sm;
        print WR $rr if $rr ne '';
        $rr='';
      } if $byte=~m![\r\cM\cJ\n]!sm;
    }
    close $client;
    waitpid($pid1,0);
  } else {
    die "cannot fork: $!" unless defined $pid;
    while(<RD>){
      print $client "$_";
    }
  }
  close $client;
}


/bin/bash сюда вставлен просто для удобства отладки. конешно я 
понимаю, что это мегадырища в безопастности и т.п. Т.е. на самом 
деле там конешно будет /bin/my_cool_program

Спасибо за ответ!
☆☆

вот как диалог с сервером выглядит с клиента:

[root@server /root]# telnet 22.15.136.142 9000
Trying 22.15.136.142...
Connected to www.server.ru (22.15.136.142).
Escape character is '^]'.
w
 01:11:10  up 4 days, 13:03,  7 users,  load average: 0.60, 0.59, 0.55
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU  WHAT
vilfred  pts/1    221.15.136.142   Tue 4pm  3days  0.03s  0.03s  -bash
vilfred  pts/2    -                Tue 8pm  3days  0.06s  0.06s  /bin/bash
vilfred  pts/3    -                Tue 8pm  3days  0.06s  0.06s  /bin/bash
vilfred  pts/4    -                Tue 8pm  3days 21.32s 21.30s  stime
vilfred  pts/5    22.15.136.142    Tue 4pm  3days  0.64s  0.59s  screen -rd
vilfred  pts/6    prorval.test.usu 12:16am 53:07   0.06s  0.01s  sshd: vilfred [
root     pts/7    prorval.test.usu 12:34am  4.00s  0.25s  0.04s  -bash
who
vilfred  pts/1        Jan 15 16:35 (221.15.136.142)
vilfred  pts/2        Jan 15 20:20
vilfred  pts/3        Jan 15 20:20
vilfred  pts/4        Jan 15 20:20
vilfred  pts/5        Jan 15 16:53 (22.15.136.142)
vilfred  pts/6        Jan 19 00:16 (prorval.test.usu)
root     pts/7        Jan 19 00:34 (prorval.test.usu)
^]

telnet> quit
Connection closed.
[root@server /root]# 

если же телнет запустить второй раз - то не заработает, отчегото, 
толи гдето перевод каретки запрятался, толи еще чето.

vilfred ☆☆
() автор топика
Ответ на: комментарий от polachok

аааа!!!! убить не могу шеллскрипт!!! в ребут машину отправил!!!

nc: invalid option -- c
nc -h for help
nc: invalid option -- c
nc -h for help
nc: invalid option -- c
nc -h for help
nc: invalid opti

[root@observ root]# rpm -qa | grep nc
nc-1.10-18
[root@observ root]#

vilfred ☆☆
() автор топика
Ответ на: комментарий от phoenix

о, спасибо, оказывается такое в природе имеется. а по поводу проги походу надо это клиентом делать. а сервер должен держать или отфоркивать клиентов. т.е. архитекутра не та у проги, т.к. одноразовая.

vilfred ☆☆
() автор топика
Ответ на: комментарий от vilfred

у Вас какой-то неправильный netcat ):

[I] net-analyzer/netcat
Available versions: 110-r8 {crypt ipv6 static}
Installed versions: 110-r8(15:47:59 15.01.2008)(-crypt -ipv6 -static)
Homepage: http://nc110.sourceforge.net/
Description: the network swiss army knife

polachok
()

Так у тебя походу 

    while(<RD>){
      print $client "$_";
    }

никогда не заканчивается.
Скрипт потом зависает на waitpid($pid1,0);

swizard
()
Ответ на: комментарий от vilfred

если надо тупо: "написать для неё оболочку, которая бы умела пробрасывать диалог пользователя с программой через сокет", то не надо изобретать велосипед, а можно воспользоваться самокатом:

/etc/services: velosiped 4444/tcp # velosiped

/etc/xinet.d/velosiped: service velosiped { port = 4444 socket_type = stream wait = yes user = root group = root server = /tmp/velosiped.pl disable = no }

/tmp/velosiped.pl:

#!/usr/bin/perl $|=1; print "HELLO\r\n"; while(<>){ print "HELLO\r\n"; }

$ sudo service xinetd restart $ telnet localhost 4444 HELLO

угу?

anonymous
()
Ответ на: комментарий от vilfred

прошу прощения (не разгадал код проверки и слетело форматирование)...

если надо тупо: "написать для неё оболочку, которая бы умела
пробрасывать диалог пользователя с программой через сокет",
то не надо изобретать велосипед, а можно воспользоваться самокатом:

/etc/services:
velosiped   4444/tcp # velosiped

/etc/xinet.d/velosiped:
service velosiped
              {
                 port        = 4444
                 socket_type = stream
                 wait        = yes
                 user        = root
                 group       = root
                 server      = /tmp/velosiped.pl
                 disable     = no
              }

/tmp/velosiped.pl:

#!/usr/bin/perl
$|=1;
print "HELLO\r\n";
while(<>){
  print "HELLO\r\n";
}

$ sudo service xinetd restart
$ telnet localhost 4444
HELLO

угу?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.