Смешивание Expect и BASH - PullRequest
       31

Смешивание Expect и BASH

0 голосов
/ 17 февраля 2012

Я написал небольшой сценарий Expect для входа в устройство Cisco;После входа в систему я хочу многократно выполнить команду и grep вывод.

#!/usr/bin/expect

send_user "Device name: "
expect_user -re "(.*)\n"
set host $expect_out(1,string)

send_user "Username: "
expect_user -re "(.*)\n"
set user $expect_out(1,string)

stty -echo
send_user -- "Password: "
expect_user -re "(.*)\n"
set pass $expect_out(1,string)
stty echo

send_user "show int "
expect_user  -re "(.*)\n"
set intf $expect_out(1,string)
send_user "\n"

spawn telnet $host
expect "Username:"
send "$user\r"
expect "Password:"
send "$pass\r"
expect ">"

На этом этапе мы вошли в устройство, я хочу выполнить команду "show int xxx" несколько раз и grepвывод для конкретной строки.grep не находится в Expect, и команда не похожа на sleep, поэтому я могу циклически выполнить команду show int, grepping из моей конкретной строки.Как я могу смешать Expect и Bash следующим образом?

ОБНОВЛЕНИЕ : Я уже довольно много сделал сценарий, выложу полный сценарий, как только преодолею это последнее препятствие.Строка set bytesnow [exec grep "packets input" \< showint | cut -d \ -f 9] выдает ошибку;

child process exited abnormally
   while executing
"exec grep "packets input" < \showint | cut -d \  -f 9"

Но она прекрасно работает в написанном мной тестовом скрипте.Файл ./showint есть, выполнение этой команды в командной строке работает нормально?Я не могу понять, что не так?

ОБНОВЛЕНИЕ : дополнительные исследования (http://wiki.tcl.tk/8489) показал мне, что grep завершает работу с кодом состояния 1, что означает, что совпадения с образцом не найденыпоставить команду работает нормально из командной строки? Даже с /full/path/to/showint.

END : я исправил свою ошибку, поняв, какой я был дурак,ответил ниже. Спасибо всем за помощь: D

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

Это то, что я бы сделал

log_user 0
while(1) {
  send -- "sh int $intf | i packets input\r"
  set timeout 5
  expect {
    -re "^ +(\d+) packets" { send_user -- "$expect_out(1,string)" }
    timeout { send_user "broke?\n" }
  }
}

Это даст вам количество введенных пакетов.

0 голосов
/ 17 февраля 2012

Это мой первый скрипт Expect, его цель - дать живую (почти 1 секунду!) Пропускную способность интерфейса. Приведенный ниже пример показывает скорость ввода интерфейса, потому что мы grep для строки, содержащей «входные пакеты». Измените это на «вывод пакетов», чтобы получить живую скорость вывода для этого интерфейса.

#!/usr/bin/expect

# Long delay for those tricky hostnames

set timeout 60

# Prompt user for device name/IP, username, password, 
# and interface to query (gi0/2)

send_user "Device name: "
expect_user -re "(.*)\n"
set host $expect_out(1,string)

send_user "Username: "
expect_user -re "(.*)\n"
set user $expect_out(1,string)

stty -echo
send_user "Password: "
expect_user -re "(.*)\n"
set pass $expect_out(1,string)
send_user "\n"
stty echo

send_user "show int "
expect_user  -re "(.*)\n"
set intf $expect_out(1,string)
send_user "\n"

spawn telnet $host
expect "Username:"
send "$user\r"
expect "Password:"
send "$pass\r"
expect ">"

set byteslast 0
set bytesnow 0

log_user 0

# Enter a continuous loop grabbing the number of bytes that
# have passed through an interface, each second.
# The different in this number each cycle, is essentially
# how much traffic this interface is pushing.

while { true } {
  send "show int $intf\r"
  expect ">"

  set showint [open "showint" "w"]
  puts $showint $expect_out(buffer)
  close $showint

  set bytesnow [exec grep "packets input" \< showint | cut -d \  -f 9]

  if { $bytesnow > $byteslast } {
    set diff [expr $bytesnow - $byteslast]
    set bps [exec expr "$diff" \* 8]
    set kbps [exec expr "$bps" \/ 1000]
  } elseif { $bytesnow < $byteslast } {
    set diff [expr $byteslast - $bytesnow]
    set bps [exec expr "$diff" \* 8]
    set kbps [exec expr "$bps" \/ 1000]
  } elseif { $bytesnow == $byteslast } {
    set kbps 0
  }

  set byteslast $bytesnow
  puts "$kbps Kbps\r"

  sleep 1
}

Поскольку это мой первый сценарий Expect, я не сомневаюсь, что он мог бы быть написан более эффективно и четко (это всегда так, как я нахожу), поэтому, если у кого-то есть какие-либо указатели на этот, я весь слух! :)

Моя проблема с моей командой exec grep заключалась в том, что до этого файл, который я открыл "showint", я не закрывал и пытался получить доступ к другому файлу; ошибка школьника!

...