2013-02-28 74 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