我正在尝试解决以下问题:使用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重放回远程机器,但不知道如何做到这一点?
这种方法也可能存在根本缺陷,因此对如何解决此问题的其他建议持开放态度?
谢谢,
马特
答案 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场景可能会有问题。