alibek Опубликовано 3 апреля, 2021 · Жалоба Есть у меня скрипт для автологона на коммутаторы: #!/usr/bin/expect set timeout 10 set host [lindex $argv 0] set user "user" set pass "password" if { $host == "" } { puts "Usage: swterm host\r" exit } send_tty "\033]0;$host\007" spawn telnet $host expect { -nocase -re "(login|name)(\(.+\))?:" { send "$user\r" } } expect { -nocase -re "(password)(\(.+\))?:" { send "$pass\r" } } expect { -timeout 1 -nocase -re "error" { send "admin\r" send "admin\r" } } expect { -timeout 1 -nocase -re "error" { send "admin\r" send "123456\r" } } expect { -timeout 1 "*\$" { send "enable\r" } "*>" { send "enable\r" } } interact send_tty "\r" send_tty "\033]0;\007" Скрипт подключается с определенным паролем, если не получилось, то пробует подключиться со стандартными паролями. Затем выполняет enable, если требуется. Но если удалось подключиться с первого раза, то ждет пару секунд, прежде чем включает enable и дает доступ к консоли. Можно ли обойти это ожидание, если логин успешен? Есть ли в expect что-то вроде goto? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
mixtery Опубликовано 3 апреля, 2021 · Жалоба есть if Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
alibek Опубликовано 3 апреля, 2021 · Жалоба Есть. И он даже у меня используется в одном месте. Но if усложнит скрипт. Идеальным было бы сделать что-то вроде goto на последний блок с except. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
snvoronkov Опубликовано 3 апреля, 2021 · Жалоба expect писан на tcl. В tcl нет goto. https://wiki.tcl-lang.org/page/Goto+in+Tcl Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
alibek Опубликовано 3 апреля, 2021 · Жалоба Ага. В общем переписал скрипт. Неидеально, но все же стало лучше. #!/usr/bin/expect set timeout 10 set host [lindex $argv 0] if { $host == "" } { puts "Usage: swterm host\r" exit } send_tty "\033]0;$host\007" spawn telnet $host foreach {user pass} [list admin password admin admin admin 123456] { expect { -nocase -re "(login|name)(\(.+\))?:" { send "$user\r" } } expect { -nocase -re "(password)(\(.+\))?:" { send "$pass\r" } } expect { -timeout 1 -re "(error|wrong|invalid)" { continue } timeout { continue } "*\$" { send "enable\r" break } "*>" { send "enable\r" break } -notransfer "*#" { break } } } expect { -timeout 1 "*#" { send "terminal monitor\r" } } interact send_tty "\r" send_tty "\033]0;\007" Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...