URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9671
[ Назад ]

Исходное сообщение
"expect скрипт"

Отправлено djeck , 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 проверял, содержит всю строку целиком.

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


Содержание

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

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

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

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


"expect скрипт"
Отправлено djeck , 29-Апр-13 14:33 
помогло спасибо!

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

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

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

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

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

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



"expect скрипт"
Отправлено михалыч , 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 нужен потому, что вы хотите "скормить" за раз все эти правила.
А реально, за один раз, "кошак" их сожрет, не подавится?


"expect скрипт"
Отправлено михалыч , 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;}
  ]
);

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


"expect скрипт"
Отправлено anonymous , 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