LINUX.ORG.RU

получение полного ответа в Expect


0

1

Пытаюсь автоматизировать получение данных с циски. Фрагмент кода после авторизации такой: ($commandfile содержит несколько команд типа show <...>)

 
set output [open ${address}"_out" w]
set fp [open "$commandfile" r]
set file_data [read $fp]
foreach line [split $file_data "\n"] {
    expect -re "#|>" {send -- "$line\r"}\
	"closed by foreign host" {puts "connection closed"}
    puts $output $expect_out(buffer)
}
close $output

на стандартный вывод отдает все содержимое конфига, а в файл через puts съедает большой кусокиз начала выхлопа для show config. ЧЯДНТ? как заставить его весь вывод отправлять в файл и не выводить на экран без перенаправления в баше ?

во первых форматирование - приведённый код гавно :)

во вторых в $output не попадает ничего что было до «#|>» - expect это съедает (он вычитывает поток пока не встретит шаблон и всё неподходящее херит). В вашем случае там просто мусор.

while { ! $the_end } {
   expect {
     -re "#>" {
        # получили приглашение
        # послали команду
        set line_to_send [ get_next_config_line $file_data ]
        send -- "$line_to_send\r"
        # похорошему надо проверять результат
        # то есть должна быть ещё одна ветка expect
     } -re "(.*)\$" {
        # получили нечто другое (выхлоп show config)
        # записали в файл
        puts $output $expect_out(buffer)
     } "closed by foreign host" {
        puts stderr "connection closed by server"
        set the_end 1
     } timeout {
        puts stderr "timeout"
        set the_end 1 
     } eof {
        puts stderr "EOF"
        set the_end 1
     }
   }
}
MKuznetsov ★★★★★
()

немного не по теме, но когда мне для кисок надоело сношение с expect, я начал пользовать rancid, моему счатьсю нету предела.

epsilon1024
()
Ответ на: комментарий от MKuznetsov

-re «#>» {

Это ведь не «любой из этих двух», а оба сразу? Если так, то надо в этом месте соответствующим образом (на «# или >») поменять.

frob ★★★★★
()
Ответ на: комментарий от frob

Это ведь не «любой из этих двух», а оба сразу?

да. Очевидная очепятка :) А над совсем уж правильными регулярками пусть ТС голову ломает - его циска, ему и настраивать :)

MKuznetsov ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.