Подключиться к хосту и воспроизвести вывод

Я пытаюсь решить следующую проблему: подключиться к заданному IP-адресу и номеру порта с помощью Netcat. Введите пароль при появлении запроса «Введите пароль:». Затем удаленная машина повторяет 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 может помочь с воспроизведением ввода-вывода обратно на удаленную машину, но не знаете, как это сделать?

Также вероятно, что этот подход в корне ошибочен, поэтому открыты для любых других предложений о том, как решить эту проблему?

Спасибо,

Мэтт


person Choc13    schedule 28.02.2013    source источник


Ответы (2)


Вы должны использовать библиотеку perl sockets, чтобы делать то, что вам нужно. Поскольку вашим примером был код Perl, я решил порекомендовать вам этот подход.

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

Примеры по URL-адресу, который я связал, показывают UDP и TCP, в то время как примеры TCP должны вам подойти. Перенаправление stdin/stdout с помощью netcat может быть проблематичным в сценариях отправки/ожидания.

person cmevoli    schedule 28.02.2013
comment
Спасибо за ссылку. Я согласен с тем, что перенаправление stdin/stdout с помощью Netcat — это боль! В конце концов, я пошел с telnetlib в Python, чтобы сделать то, что мне нужно было сделать, но, учитывая, что мой вопрос был на Perl, следовательно, ваш ответ относился к Perl, я принимаю ваш как решение, поскольку оно ближе всего к тому, что я сделал ибо в итоге. Спасибо. - person Choc13; 05.03.2013

Используйте 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
person perl_advocate    schedule 28.02.2013
comment
Спасибо за это, я буду иметь это в виду на будущее, так как это выглядит как хороший простой способ обойти множество головных болей, с которыми я столкнулся в своем исходном сценарии. - person Choc13; 05.03.2013