Я написал небольшой сценарий 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
нет ни в 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, что означает, что совпадений с шаблоном не найдено, команда put работает нормально из командной строки? Даже с /full/path/to/showint.
КОНЕЦ: я исправил свою ошибку, поняв, каким дураком я был, ответил ниже. Всем спасибо за помощь :D
router#sh int <int> | i packets input
с пробелом в качестве разделителя. Я вижу только 8 полей в моем выводе. Можете ли вы рассказать нам, чего вы пытаетесь достичь?798518177 packets input, 60933723489 bytes, 0 no buffer
- person resmon6   schedule 17.02.2012