2013-02-28 69 views
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重放回远程计算机的帮助,但不知道该怎么做?

这也有可能,这种做法基本上是错误的,所以开到如何解决这个任何其他建议?

感谢,

马特

回答

1

你应该使用Perl套接字库做你的需要。由于你的例子是Perl代码,我认为我会为你推荐这种方法。

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

在URL中的例子我联系节目UDP和TCP,而TCP的例子应该为你工作。使用netcat重定向stdin/stdout可能会在发送/期望情况下出现问题。

+0

感谢您的链接。我同意用Netcat重定向stdin/stdout是一种痛苦!最后,我用Python中的telnetlib去做我需要做的事情,但考虑到我的问题在Perl中,因此你的答案与Perl相关,我接受你的解决方案,因为它与我所接近的为最后。谢谢。 – Choc13 2013-03-05 11:32:21

2

使用期待交互式命令: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 
+0

感谢你们对未来的关注,因为它看起来像是一种很好的简单方法,可以解决我在原始脚本中遇到的许多问题。 – Choc13 2013-03-05 11:33:38