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 を使用して stdin/stdout をリダイレクトすると、send/expect シナリオで問題が発生する可能性があります。

于 2013-02-28T13:09:05.517 に答える