Назад | Перейти на главную страницу

Ожидается, что при чтении из файла возникнет проблема со сценарием

Я пытаюсь изменить пароль для пользователя на нескольких маршрутизаторах на базе Linux, извлекающих IP-адреса из списка. Iplist.txt - это просто список IP-адресов (по одному в каждой строке). Это код, который я пытаюсь использовать:

    #!/usr/bin/expect
    set timeout 20
    #Edit for User
    set user username
    #Edit for Old Password
    set old oldpassword
    #Edit for New Password
    set new newpassword
    #get IP List from iplist.txt
    set f [open "/iplist.txt"]
    set hosts [split [read $f] "\n"]
    close $f

    foreach host $hosts {
            spawn -noecho ssh -q -o "StrictHostKeyChecking=no" $user@$host
            expect "assword:"
            send "$old\r"
            expect ">"
            send "user set $user password=$new\r"
            expect ">"
            send "quit\r"
            expect eof
            close
    }

Что работает для первого ip в списке, но отправляет эту ошибку на втором:

    spawn_id: spawn id exp4 not open

Я заставил это работать так, как я хотел:

#!/usr/bin/expect
set timeout 30
#Edit for User
set user user
#Edit for Old Password
set old oldpassword
#Edit for New Password
set new newpassword
#get IP List from iplist.txt
set f [open "/iplist.txt"]
set data [read $f]
close $f

foreach line [split $data \n] {
        if {$line eq {}} continue
        spawn -noecho ssh -q -o "StrictHostKeyChecking=no" $user@$line
        expect "assword:"
        send "$old\r"
        expect ">"
        send "user set $user password=$new\r"
        expect ">"
        send "\r"
        expect ">"
        send "quit\r"
        send "\r"
        expect eof
}

Следующая проблема, с которой я столкнулся, заключается в том, что если на устройстве нет старого пароля или если Linux-ящик не может связаться с устройством через ssh, он выдаст ошибку с тем же идентификатором спауна exp * not open, когда он попадет на этот IP-адрес и будет не переходить на следующий IP-адрес в списке. Могу ли я как-то сказать, что если "assword:" появляется во второй раз, чтобы перейти на следующий IP-адрес, и если появляется ">", как будто он должен продолжать работу со сценарием, то добавьте строку после команды spawn, которая переместится к следующему IP-адресу в списке, если он не получит первое ожидаемое «assword:»?

Любая помощь будет оценена. Я новичок, но, похоже, это действительно хороший инструмент для массовых ssh-процессов в скрипте. Просто возникла проблема с настройкой, чтобы не возникала ошибка в 1 задании вместо перехода к следующему заданию при ошибке.

#!/usr/bin/expect
set timeout 30
#Edit for User
set user user
#Edit for Old Password
set old oldpassword
#Edit for New Password
set new newpassword
#get IP List from iplist.txt
set f [open "/iplist.txt"]
set data [read $f]
close $f

foreach line [split $data \n] {
        if {$line eq {}} continue
        spawn -noecho ssh -q -o "StrictHostKeyChecking=no" $user@$line
        expect {
                "assword:" {
                        send "$old\r"
                        expect {
                                "assword:" {
                                                close
                                                continue
                                                }}
                        expect {
                                "*" {
                                        send "user set $user password=$new\r"
                                        expect ">"
                                        send "quit\r"
                                        close
                                        continue
                                        }}}}
        expect {
                "*" {
                        close
                        continue
                        }}
        expect eof
}

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