Перейти к содержимому
Калькуляторы

Вопрос по скрипту expect

Есть у меня скрипт для автологона на коммутаторы:

#!/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?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Есть. И он даже у меня используется в одном месте.

Но if усложнит скрипт.

Идеальным было бы сделать что-то вроде goto на последний блок с except.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

expect писан на tcl. В tcl нет goto.

 

https://wiki.tcl-lang.org/page/Goto+in+Tcl

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ага.

В общем переписал скрипт.

Неидеально, но все же стало лучше.

#!/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"

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.