ожидайте - соединение через telnet - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь создать простой сценарий подключения telnet.Я порождаю процесс Telnet.В зависимости от версии, он может запрашивать или не запрашивать пароль.

После этого он запрашивает имя пользователя и пароль и принимает правила.После успешного входа в систему он запрашивает команду.

Однако то, что я написал, не работает.

#/usr/bin/expect -f
set IP [lindex $argv 0]
set timeout 10
set send_slow {10 .5}
log_user 1

spawn telnet -l cli $IP

expect {
    timeout {
        puts "Network Connection Problem"
        close
    }
    "Password:" {
        send -s -- "cli\r"
        exp_continue
    }
    "Username:" {
        send -s -- "admin\r"
        expect "Password:"
        send -s -- "admin\r"
        exp_continue
    }
    "(Y/N)?" {
        send -s -- "Y\r"
        exp_continue
    }   
}
expect "# "
send -s -- "show version\r"

После запуска сценария я прохожу через логин и соглашение.После отображения приглашения сценарий не выполняет команду show version.Курсор мигает через несколько секунд, когда я вижу информацию:

ожидаемо: spawn id exp6 не открывается при выполнении команды "ожидаемо" # ""

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

Помоги мне, капитан.

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Вам нужна по крайней мере одна ветвь в этой ожидаемой команде, которая выполняет , а не"exp_continue": поместите шаблон для приглашения в качестве последнего шаблона в команде ожидания без действий: когда ожидающий видит приглашение,ожидаемая команда завершится, и ваш скрипт сможет продолжить.

expect {
    timeout {
        puts "Network Connection Problem"
        close
        exit    ;# if you don't exit, your next command is "send" which will fail
    }
    "Password:" {
        send -s -- "cli\r"
        exp_continue
    }
    "Username:" {
        send -s -- "admin\r"
        expect "Password:"
        send -s -- "admin\r"
        exp_continue
    }
    "(Y/N)?" {
        send -s -- "Y\r"
        exp_continue
    }   
    "# "
}
send -s -- "show version\r"
0 голосов
/ 28 мая 2018

Здесь есть оператор

spawn telnet -l cli $IP

, который указывает имя пользователя как cli для сеанса telnet.Таким образом, код для входа в систему как admin никогда не будет достигнут.

Приглашение оболочки по умолчанию для администратора:

'# '

Приглашение оболочки по умолчанию для cli:

'$ '

изменить код для обработки поиска любого приглашения оболочки.

...