Ожидайте чтения сценариев из файла
Я пытаюсь сменить пароль для пользователя на нескольких маршрутизаторах на основе Linux, извлекающих IP-адреса из списка. Iplist.txt - это просто список ips (по одному на строку). Это код, который я пытаюсь использовать:
#!/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, оно выдаст ошибку с тем же идентификатором spawn exp*, который не будет открыт, когда он доберется до этого IP и будет не переходить на следующий IP в списке. Есть ли в любом случае утверждение, которое говорит, что если "assword:" появляется во второй раз, чтобы перейти на следующий IP, и если ">" появляется, как это должно продолжаться со сценарием, то добавьте строку после команды spawn, которая перейдет к следующему IP в списке, если он не получит первый ожидаемый "assword:"?
Любая помощь будет оценена. Я новичок в ожидании, но, похоже, действительно хороший инструмент для массовых процессов ssh в скрипте. Просто возникают проблемы с его настройкой, чтобы не допустить ошибки на 1 задании, вместо перехода к следующему заданию в случае ошибки.
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
}
Возможно, немного грязные скрипты, но это работает. Теперь, если мне удастся выяснить, как экспортировать успешные, неправильные пароли и журналы тайм-аутов, я буду знать, исключена ли какая-либо ошибка.