连接到主机并重播输出

时间:2013-02-28 12:37:15

标签: linux perl io netcat

我正在尝试解决以下问题:使用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重放回远程机器,但不知道如何做到这一点?

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

谢谢,

马特

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您应该使用perl套接字库来执行您需要的操作。由于您的示例是perl代码,我以为我会为您推荐这种方法。

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

我链接的URL上的示例显示UDP和TCP,而TCP示例应该适合您。使用netcat重定向stdin / stdout对于send / expect场景可能会有问题。