[英]Password Change Expect Script
第一次調用者,長時間的監聽者,我有一個問題圍繞着一個期望腳本並在幾台主機上更改了密碼。 我沒有任何問題可以使期望腳本旋轉或更改密碼,我遇到的問題是期望腳本能夠處理多個“期望”。 我需要說明4件事,我們的環境糟透了-請忍受。
我的腳本正在遍歷主機列表並登錄,我希望它執行以下操作之一:登錄時,如果帳戶過期,它將期望某些操作並更改密碼,這可以正常工作。 如果仍然無法解決,並且腳本使用舊密碼正常登錄,則只需執行passwd命令並更改密碼即可。 我現在遇到的問題是使這兩件事可以正確地一起工作。
如果主機列表中包含混合帳戶,則該帳戶已過期且信譽良好,我希望能夠遍歷並適當處理每種情況,然后進行記錄。 現在,如果我放入一些帳戶已過期且沒有問題的測試主機(4到5個),那么如果最后一個主機都已過期,則腳本可以工作。 但是如果第一個主機已過期,則必須移至新主機,將無法使用。
這是下面的代碼,我在互聯網上搜尋知識,沒有匹配的結果。
我想說的是,如果期望值==(當前UNIX密碼),那么請執行此操作,如果正在使用舊密碼,請繼續使用並更改為新密碼...確實很難使它一起工作。
#!/usr/bin/expect
set timeout 10
set user userAccount
set password oldPassword
set new_password newPassword
set f [open "input.txt"]
set hosts [read $f]
close $f
## need to say if the expected value is "(current) UNIX password: then do this"
foreach host $hosts {
spawn -noecho /bin/ssh -q -o StrictHostKeychecking=no "$user\@$host"
expect "Password:"
send "$password\r"
expect {
"(current) UNIX password:" {send $password\r; exp_continue}
"New password:" {send $new_password\r; exp_continue}
"Retype new password:" {send $new_password\r; exp_continue}
"~]$" {close}
}
send "echo -e '$password\n$new_password\n$new_password' | passwd\r"
expect "~]$" {close}
}
我懷疑最簡單的解決方案是對您的第一個Expect命令進行一些更改:
expect {
"(current) UNIX password:" {send $password\r; exp_continue}
"New password:" {send $new_password\r; exp_continue}
"Retype new password:" {send $new_password\r}
"~]$" {send "echo -e '$password\n$new_password\n$new_password' | passwd\r"}
}
expect "~]$" {close}
關鍵部分是第二次發送新密碼后沒有exp_continue。 然后它將脫離第一個Expect命令,並且僅匹配第二個Expect命令的提示。 如果密碼尚未過期,則會在第一個Expect命令中找到提示。 這樣便可以在其中運行passwd命令。
加上您的其他願望,循環主體可能看起來像這樣:
spawn -noecho /bin/ssh -q -o StrictHostKeychecking=no "$user\@$host"
expect "assword: "
send "$password\r"
expect {
-timeout 30
"(current) UNIX password: " {
# Password has expired
send $password\r
expect {
"New password: " {
send $new_password\r
exp_continue
}
"Retype new password: " {
send $new_password\r
exp_continue
}
"all authentication tokens updated successfully." {
# Password has been changed
}
default {
error "Failed to change the password"
}
}
}
"assword: " {
# Old password was not accepted
send $new_password\r
expect {
-timeout 30
-ex "~]$" {
# New password was accepted
}
"assword: " {
# New password was not accepted either
error "None of the passwords was accepted"
}
default {
error "Failed to log in"
}
}
}
"locked" {
# Account is locked
}
-ex "~]$" {
# Logged in with old password
send "echo -e '$password\n$new_password\n$new_password' | passwd\r"
expect {
-ex "~]$" {
# Password successfully updated
}
default {
error "passwd command failed"
}
}
}
default {
error "Log in timed out"
}
}
close
那將是基本結構。 如果效果exp_internal 1
,請添加exp_internal 1
命令以確定需要進行哪些調整。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.