The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"expect скрипт"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"expect скрипт"  +/
Сообщение от djeck on 29-Апр-13, 14:07 
задача, по логам автоматизировать добавление правил блокировки доступа.

придумал такую штуку:

~/ttt.sh

#/bin/sh
ip=$( cat 1.txt )
./t $ip

~/t
#!/usr/bin/expect -f
set a "*"
set b "*"
set c "*"
set tt [lindex $argv 0]
spawn ssh -T $c@192.168.1.1;
expect "password:"
send "$a\r"
expect ">"
send "en\r"
expect "password:"
send "$b\r"
expect "#"
send "conf t\r"
expect "#"
send "$tt"
expect "#"
send "exit\r"
send "exit\r"
expect eof


~/1.txt
access-list inside_access_in extended permit ip host 192.168.1.4 any i\r

первый скрипт присваивает содержимое файла переменной, которая передается скрипту.
в этом скрипте так сказать ключевая строчка:

send "$tt"

однако, в консоле я вижу, что скармливается не все содержимое файле а лишь "access-list" то есть до первого пробела.

переменную $tt проверял, содержит всю строку целиком.

тогда в чем может быть проблема? почему строка урезается?

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "expect скрипт"  +/
Сообщение от Andrey Mitrofanov on 29-Апр-13, 14:12 
> придумал такую штуку:
> ~/ttt.sh
> #/bin/sh
> ip=$( cat 1.txt )
> ./t $ip
> однако, в консоле я вижу, что скармливается не все содержимое файле а
> лишь "access-list" то есть до первого пробела.

Очевидно же, кавычек "не хватает" (скорее вторых, чем первых):

ip="$( cat 1.txt )"
./t "$ip"

> переменную $tt проверял, содержит всю строку целиком.
> тогда в чем может быть проблема? почему строка урезается?

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "expect скрипт"  +/
Сообщение от djeck on 29-Апр-13, 14:33 
помогло спасибо!

но возникла еще одна проблемка неожиданно.

"\r" не отрабатывает.
в конце строки стоит "\r" в файле, и он не исполняется send-ом.
получается его наружу за переменную надо выносить.

а это не есть хорошо, так как файл 1.txt надо будет скармливать построчно.

получится что для ввода одного блокирующего правила, надо подключиться ввести правило, отключится. и так для каждого правила. а если их будет сотня? как то кривовато.

удобней было бы один раз подключиться, скормить сотню правил, отключиться. как я собственно изначально и планировал.

может что то порекомендуете?


Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "expect скрипт"  +/
Сообщение от михалыч (ok) on 29-Апр-13, 21:50 
Что собой представляет файл 1.txt ?
Насколько я понял, это access list для "кошака"?

Типа
access-list inside_access_in extended permit ip host 192.168.1.4 any i
access-list inside_access_in extended permit ip host 192.168.1.5 any i
access-list inside_access_in extended permit ip host 192.168.1.6 any i
access-list inside_access_in extended permit ip host 192.168.1.7 any i

На самом деле без \r вконце, так?
И \r нужен потому, что вы хотите "скормить" за раз все эти правила.
А реально, за один раз, "кошак" их сожрет, не подавится?

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "expect скрипт"  +/
Сообщение от михалыч (ok) on 29-Апр-13, 23:42 
Тут чистым expect наверное не прокатит.
perl ?

#!/usr/bin/perl

use Expect;

$Expect::Log_Stdout = 1;

$file = '/tmp/1.txt';

open ( FILE, "$file" );
@acclist = <FILE>;
close ( FILE );

my $exp = Expect->spawn("ssh user\@192.168.1.1");
$exp->stty(qw(-echo));
$exp->expect($timeout,
  ['Password:' => sub {
    $exp->send("password\n");
    exp_continue; }
  ],
  ['\$' => sub {
    foreach $rules (@acclist) {
      $exp->send("$rules\n");
    }
    $exp->send("exit\n");
    exp_continue;}
  ]
);

"кошака" под рукой нет, его не готовил, то есть на нём не проверял ))

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

5. "expect скрипт"  +/
Сообщение от anonymous (??) on 30-Апр-13, 09:36 
>[оверквотинг удален]
> в конце строки стоит "\r" в файле, и он не исполняется send-ом.
> получается его наружу за переменную надо выносить.
> а это не есть хорошо, так как файл 1.txt надо будет скармливать
> построчно.
> получится что для ввода одного блокирующего правила, надо подключиться ввести правило,
> отключится. и так для каждого правила. а если их будет сотня?
> как то кривовато.
> удобней было бы один раз подключиться, скормить сотню правил, отключиться. как я
> собственно изначально и планировал.
> может что то порекомендуете?

Во-первых, раз уж вы используете ssh, сделайте авторизацию по ключу. Желательно так же привязать это дело к tacacs+/radius, чтобы сразу попадать в привилегированный режим.
Во-вторых, так (за один раз все правила без "\r") не бывает. После каждой строчки должен быть "\r", в случае работы через Expect.
Либо загружайте на циску кусок конфига и применяйте к текущему running-config, тогда будет за один раз. Или tcl скрипт на циске запускайте...
Рекомендую книжку "Exploring Expect" авторства Don Libes. К тому же, программируя на expect, по сути, используется tcl. Так что можно скрипт переписать вот так:

#!/usr/bin/env tclsh

package require Expect

# Устанавливаем переменные для пароля, логина и адреса подключения
set username {myuser}
set password {mypass}
set enablePass {enpass}
set ip {10.10.10.10}
# Открываем файл со списком правил
set fd [open ~/1.txt]
spawn ssh -T $username@$ip
expect {
    "assword:" {
        exp_send "$password\r"
    } timeout {
        puts stderr "Connection error, exiting"
        exit 1
    }
}
expect ">" {exp_send "enable\r"}
expect "assword:" {exp_send "$enablePass\r"}
expect "#" {
    "#" {
        exp_send "conf term\r"
    } timeout {
        puts stderr "Enable failed"
        exit 1
    }
}
# Посылаем правила построчно
while {[gets $fd line] >= 0} {expect "#" {exp_send "$line\r"}}
expect "#" {exp_send "end\r"}
expect "#" {exp_send "exit\r"}
close $fd; exit 0

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру