Ожидайте перейти к следующему появлению неправильного имени пользователя или пароля - PullRequest
0 голосов
/ 18 января 2019

У меня есть небольшая проблема, когда я ожидаю. Я использовал его в течение нескольких лет с хорошими результатами, но теперь у меня был неправильный пароль, поэтому скрипт перестает работать до конца.

Я использовал ожидаемый на Linux для перезагрузки камер видеонаблюдения в моей компании с помощью cron. Это работало хорошо, пока я не обновил несколько своих камер до более новой модели, и тогда это было неправильное имя пользователя и пароль, которые были по умолчанию. Я не заметил этого, пока я не просмотрел свои журналы, которые ожидали, что перестали работать с ошибкой пароля. Поэтому я немного покопался и хотел просто послать ctrl-C, чтобы прервать соединение и перейти к следующему спавну, но пока что не повезло. Я пробовал много разных методов, но пока ни один из них не работает.

spawn telnet $11
expect {
"unable to connect to remote host:" { }
"login:" {
send "username\r"
expect "password:"
send "$password\r"
expect {
"wrong username or password"
send "\003" }
expect "#"
send "shutdown -r now\r"
expect "#" 
send "exit\r"
expect "Connection closed by foreign host." }
}
Spawn telnet $12

в результате вместо вызова telnet 12 он просто идет в конец файла.

Кто-нибудь может ответить на мой вопрос?

1 Ответ

0 голосов
/ 18 января 2019

Вот почему отступ в вашем коде важен. У вас есть это:

spawn telnet $11
expect {
    "unable to connect to remote host:" { }
    "login:" {
        send "username\r"
        expect "password:"
        send "$password\r"
        expect {
            "wrong username or password"
            send "\003" 
        }
        expect "#"
        send "shutdown -r now\r"
        expect "#" 
        send "exit\r"
        expect "Connection closed by foreign host." 
    }
}

В частности, этот бит неверен:

    expect {
        "wrong username or password" 
        send "\003" 
    }

Это то, что ожидают на самом деле видит, потому что ожидайте хочет блок "действия" для каждого шаблона, за исключением последнего шаблона:

    expect {
        "wrong username or password" send 
        "\003" 
    }

Это связано с тем, что Tcl является слово-ориентированным языком. Итак, у вас есть 2 шаблона: «неправильный пользователь ...» или «\ 003».

Это то, что вы хотите:

    expect {
        "wrong username or password" {send "\003"}
        "#" {
            send "shutdown -r now\r"
            # do you really expect another prompt after rebooting?
            expect eof
        }
    }
...