задача, по логам автоматизировать добавление правил блокировки доступа.придумал такую штуку:
~/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 проверял, содержит всю строку целиком.
тогда в чем может быть проблема? почему строка урезается?
> придумал такую штуку:
> ~/ttt.sh
> #/bin/sh
> ip=$( cat 1.txt )
> ./t $ip
> однако, в консоле я вижу, что скармливается не все содержимое файле а
> лишь "access-list" то есть до первого пробела.Очевидно же, кавычек "не хватает" (скорее вторых, чем первых):
ip="$( cat 1.txt )"
./t "$ip"> переменную $tt проверял, содержит всю строку целиком.
> тогда в чем может быть проблема? почему строка урезается?
помогло спасибо!но возникла еще одна проблемка неожиданно.
"\r" не отрабатывает.
в конце строки стоит "\r" в файле, и он не исполняется send-ом.
получается его наружу за переменную надо выносить.а это не есть хорошо, так как файл 1.txt надо будет скармливать построчно.
получится что для ввода одного блокирующего правила, надо подключиться ввести правило, отключится. и так для каждого правила. а если их будет сотня? как то кривовато.
удобней было бы один раз подключиться, скормить сотню правил, отключиться. как я собственно изначально и планировал.
может что то порекомендуете?
Что собой представляет файл 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 наверное не прокатит.
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;}
]
);"кошака" под рукой нет, его не готовил, то есть на нём не проверял ))
>[оверквотинг удален]
> в конце строки стоит "\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