perl - 使用Perl客户端-服务器(套接字)执行远程命令

标签 perl sockets

我的client.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";

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

问题:-

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

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

任何帮助,将不胜感激。

谢谢
阿比舍克

最佳答案

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

print scalar <$socket>;

如果删除scalar,它将正常工作。 但是,您的体系结构仍然是安全的噩梦。
  • 所有服务器都应以taint模式运行(-T开关)。
  • 切勿盲目执行客户端发送给您的命令。仅执行通过非常严格的验证测试的命令,而不运行看起来并不恶意的命令。
  • 也许您正在尝试复制SSH,但您可能想查看该程序。
  • 您的服务器不执行任何身份验证。至少它记录了所有输入。
  • 关于perl - 使用Perl客户端-服务器(套接字)执行远程命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13740906/

    相关文章:

    c++ - 从 NFQueue 读取数据包时的序列号为零

    visual-studio-2010 - 将类从 MFC 移植到 C++ 控制台应用程序。使用/MD[d](CRT dll版本)构建MFC应用程序需要

    c++ - 尝试使用 C 中的套接字从 http 网站检索 html 时连接被拒绝

    perl - 如何在字符串而不是文件上使用模板工具包?

    regex - 如何根据匹配移动到 Excel 工作表的不同单元格?

    linux - perl的文件检查IO密集吗?

    C++ 套接字发送结构

    c++ linux accept()在套接字关闭后阻塞

    perl - 空列表可以在标量上下文中吗?

    perl - 套接字中的 Socket recv、sysread 和 Posix::read 之间的区别?