Страница 1 из 1

Как из скрипта выполнить команды в telnet

Добавлено: 2012-11-22 12:11:43
kharkov_max
Добрый день.

Возможно ли из shell скрипта подключится к хосту по протоколу telnet и выполнить, сделать вывод нескольких команд.
Вручную команды работают, по процесс нужно автоматизировать скриптом.
Если не тяжело киньте примером ...

Re: Как из скрипта выполнить команды в telnet

Добавлено: 2012-11-22 12:20:53
FreeBSP

Код: Выделить всё

> cat  /usr/ports/lang/expect/pkg-descr
Expect is a program that performs programmed dialogue with other
interactive programs.  It is briefly described by its man page, expect(1).

It uses pseudo-tty's to control the child processes, so it is not affected
by programs that refuse to read from stdin or pipes. (eg: passwd(1) etc).

WWW: http://expect.nist.gov/
FAQ: http://expect.nist.gov/FAQ.html
>
сам не щупал

Re: Как из скрипта выполнить команды в telnet

Добавлено: 2012-11-22 12:30:10
kharkov_max
Уже нашел про expect.

Такой вопрос, а будет ли возможным и как реализовать.
К примеру мне из вывода telnet необходимо получить данные, далее в shell их проанализировать (изменить, добавить) и передать в telnet на хост команду с параметрами.

Просто пока не совсем понимаю как это все можно связать в shell скрипт ...

Re: Как из скрипта выполнить команды в telnet

Добавлено: 2012-11-22 13:08:10
liet
kharkov_max писал(а):Уже нашел про expect.

Такой вопрос, а будет ли возможным и как реализовать.
К примеру мне из вывода telnet необходимо получить данные, далее в shell их проанализировать (изменить, добавить) и передать в telnet на хост команду с параметрами.

Просто пока не совсем понимаю как это все можно связать в shell скрипт ...
если не ошибаюсь - можно. с экспектом не очень активно работал. в основном задача сводилась до выполнения определенных команд. но с другой стороны никто не запрещает писать консольные скриты на перле или пхп.

Re: Как из скрипта выполнить команды в telnet

Добавлено: 2012-11-22 13:31:29
kharkov_max
Нашел empty http://www.opennet.ru/base/dev/interact ... s.txt.html
Вроде как то что нужно

Пишу

Код: Выделить всё

#!/bin/sh

empty -f -i in.fifo  -o out.fifo telnet -K 192.168.0.1 7777
empty -w -i out.fifo -o in.fifo "ogin:" "login\n"
empty -w -i out.fifo -o in.fifo "assword:" "password\n"
empty -s -o in.fifo "command > /usr/home/Script/keylist.txt\n"
empty -s -o in.fifo "exit\n"
В результате получаю

Код: Выделить всё

empty: Data stream is empty. Keyphrase wasn't found. Exit on timeout
empty: Data stream is empty. Keyphrase wasn't found. Exit on timeout
Такое ощущение что вообще не подключается телнетом
А скрипт на expect отработал нормально ...
Но expect будет тяжело выводить в файл и т.д. думаю использовать empty, только пока не понятно почему не телнетится ...

Re: Как из скрипта выполнить команды в telnet

Добавлено: 2012-11-22 14:25:54
kharkov_max
Ошибку поборол, просто empty уже висел в процессах.
Сделал killall -9 empty, и на всякий случай вставил в скрипт.

Но теперь при запуске скрипт просто висит и все, передача логина похоже не проходит.

Re: Как из скрипта выполнить команды в telnet

Добавлено: 2012-11-22 15:39:39
liet
куча лишних переменных. выдирал из своего скрипта куски кода.

Код: Выделить всё

#!/usr/bin/perl
use Net::Telnet ();
use Switch;

my ($user, @passwd, $pwd, $t, $ip_sw, $ip_user, $port, $port1, $porti, $mac);
my $t;

sub catalyst
{
        $t = new Net::Telnet;
        $t->open($ip_sw);
        $t->waitfor('/username:.*/i');
        $t->print($user);
        print $user."\n";
        $t->waitfor('/password:.*/i');
        $t->print($pwd);
        print $pwd."\n";
        $t->print("enable");
        $t->waitfor('/password:.*/i');
        $t->print($pwd);
        $t->waitfor('/\S+\#/');
        $t->print("conf t");
        $t->waitfor('/\S+\#/');
        $t->print("no username admin");
        $t->waitfor('/\S+\#/');
        $t->print("username admin privilege 15 password **********");
        $t->waitfor('/\S+\#/');
        $t->print("no enable secret");
        $t->waitfor('/\S+\#/');
        $t->print("enable secret ********");
        $t->waitfor('/\S+\#/');
        $t->print("end");
        $t->waitfor('/\S+\#/');
        $t->print("write");
        $t->waitfor('/\S+\#/');
        $t->print("exit");
#       $t->waitfor("/Connection closed by foreign host./");
        $t->close;
}
как-то так сумбурно.
а дальше читаем о библиотеке Net::Telnet

Re: Как из скрипта выполнить команды в telnet

Добавлено: 2012-11-22 16:17:36
kharkov_max
Вот так вроде получается

(sleep 1 ; command1 ; sleep 2 ; command2 .....) | telnet IP port | grep ... | ... > ./filename.txt