1

我的客户.pl

#!/usr/bin/perl
use IO::Socket::INET;
use strict;

my $name = '172.20.10.189'; #Server IP
my $port = '7890';

my $socket = IO::Socket::INET->new('PeerAddr' => $name,
                                   'PeerPort' => $port,
                                'Proto' => 'tcp') or die "Can't create socket ($!)\n";

print "Client sending\n";
while (1) {
    my $msg = <STDIN>;
    print $socket $msg;
    print scalar <$socket>;
}
close $socket
    or die "Can't close socket ($!)\n";

我的服务器.pl

#!/usr/bin/perl
use IO::Socket::INET;
use strict;

my $port = "7890";

my $socket = IO::Socket::INET->new('LocalPort' => $port,
                                   'Proto' => 'tcp',
                                   'Listen' => SOMAXCONN)
    or die "Can't create socket ($!)\n";


while (my $client = $socket->accept) {
    my $name = gethostbyaddr($client->peeraddr, AF_INET);
    my $port = $client->peerport;
    while (<$client>) {
        print "[$name $port] $_";
        my @out = `$_`;
        print @out;
        print $client "$.: @out";
    }
    close $client
        or die "Can't close ($!)\n";
}

die "Can't accept socket ($!)\n";

我的客户端正在向服务器发送命令(ls -lrt /),服务器应该运行该命令并将输出发送回客户端。

问题:-

该命令在服务器上成功执行,但它只向客户端发送第一行。如果我再次按下客户端的任何键,则下一行输出将发送到客户端。

或者告诉我如何将多行输出发送回客户端。

任何帮助,将不胜感激。

谢谢阿布舍克

4

2 回答 2

3

服务器将所有行发送到客户端,但是客户端选择只读取一行:

print scalar <$socket>;

如果您删除scalar,它应该可以工作。但是,您的架构仍然是一场安全噩梦。

  • 所有服务器都应该在污点模式下运行(-T开关)。
  • 永远不要盲目地执行客户发送给您的命令。只执行通过非常严格的验证测试的命令,不要运行看起来没有恶意的命令。
  • 也许您正在尝试复制 SSH,您可能想查看该程序。
  • 您的服务器不进行任何类型的身份验证。至少它记录所有输入。
于 2012-12-06T10:04:50.947 回答
0

这是一个愚蠢的错误......我已经解决了第一个问题,如下所示,并在客户端获得了多行输出......

客户端.pl

#!/usr/bin/perl
use IO::Socket::INET;
use strict;

my $name = '172.20.10.189'; #Server IP
my $port = '7890';

my $socket = IO::Socket::INET->new('PeerAddr' => $name,
                                   'PeerPort' => $port,
                                   'Proto' => 'tcp')
    or die "Can't create socket ($!)\n";
print "Client sending\n";

while (1) {
        my $msg = <STDIN>;
        print $socket $msg;
        while (<$socket>)
        {
                print "\n$_";
        }
}

close $socket or die "不能关闭套接字 ($!)\n";

但还有一个问题——

我希望我的客户一个接一个地发送几个其他命令,直到我手动关闭客户端并接收输出。

问题是 - 它只接收第一个命令的输出..

现在有人可以帮助我吗?

于 2012-12-06T10:09:02.423 回答