0

我正在尝试解决以下问题:使用 Netcat 连接到给定的 IP 地址和端口号。在“输入密码:”提示时输入密码。然后远程机器回显 2 行文本(1 行随机)。我的任务是在超时之前将这些消息发送回主机并终止。

似乎我应该能够使用一个简单的脚本来执行此操作,该脚本从命令行(本地)读取并将这些行的数据发送回远程机器。我尝试过一个看起来像这样的 perl 脚本:

#!/bin/perl -w;

use strict;
use warnings;

my $PASSWORD = "password";

my $timeout = 20;
my $timenow = time;

while (time - $timenow < $timeout) { 
    while (my $input = <STDIN> ) {
        if ($input =~ "password") {
            print $PASSWORD . "\n";
        } else {
            print $input;
        }
    }
}

然后运行:

nc <address> <port> | ./perlscript.pl

这可以将密码打印到我的终端,但随后失败。经过一番摸索后,似乎密码实际上并没有被发送到远程机器:

echo "PASSWORD" | nc <address> <port> | ./perlscript.pl

让我通过密码提示,打印出远程机器发送的消息,但似乎它们实际上并没有被发回。

有谁知道我如何实现这个目标?似乎使用某种 mknode 管道可能有助于将 I/O 重放回远程机器,但不知道该怎么做?

这种方法也可能存在根本缺陷,因此对如何解决此问题的任何其他建议持开放态度?

谢谢,

马特

4

2 回答 2

2

将 Expect 用于交互式命令:http ://search.cpan.org/~rgiersig/Expect-1.20/Expect.pod

use Expect;
my $command="nc";
my @params="ipaddress port";
my $exp = Expect->spawn($command, @params);
$exp->expect(10,'-re', "Enter password:");
$exp->send("your_password\n");
my $output = $expect->after() 
# you may need some more code based on the output from nc
于 2013-02-28T22:00:01.070 回答
1

您应该使用 perl 套接字库来做您需要的事情。由于您的示例是 perl 代码,我想我会为您推荐这种方法。

http://www.thegeekstuff.com/2010/07/perl-tcp-udp-socket-programming/

我链接的 URL 中的示例显示了 UDP 和 TCP,而 TCP 示例应该适合您。使用 netcat 重定向标准输入/标准输出可能会在发送/预期场景中出现问题。

于 2013-02-28T13:09:05.517 回答