【问题标题】:Remote command execution using perl client-server (socket)使用 perl 客户端-服务器(套接字)执行远程命令
【发布时间】:2012-12-06 18:09:02
【问题描述】:

我的客户.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 /),服务器应该运行该命令并将输出发送回客户端。

问题:-

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

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

任何帮助将不胜感激。

谢谢 阿布舍克

【问题讨论】:

  • 你错了。整个输出被发回,但您只读取其中的一行。您需要添加一种机制来传达响应的长度或结束的时间,并读取响应而不是读取一行。

标签: perl sockets


【解决方案1】:

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

print scalar <$socket>;

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

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

【讨论】:

    【解决方案2】:

    这是一个愚蠢的错误...我已将第一个问题修复如下,并在客户端获得了多行输出...

    客户端.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$_";
            }
    }
    

    关闭 $socket or die "Can't close socket ($!)\n";

    但是还有一个问题-

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

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

    现在有人可以帮我解决这个问题吗?

    【讨论】:

    • 您应该更新您的问题或提出新问题。答案是针对(可能的)解决方案,而不是针对问题的详细说明。如果您自己发现了错误并且暂时感到满意,您可以接受自己的答案并继续提出另一个问题。
    • 这是一个不充分的答案......所以寻找一个合适的答案。
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 2021-11-08
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    相关资源
    最近更新 更多