簡體   English   中英

密碼更改期望腳本

[英]Password Change Expect Script

第一次調用者,長時間的監聽者,我有一個問題圍繞着一個期望腳本並在幾台主機上更改了密碼。 我沒有任何問題可以使期望腳本旋轉或更改密碼,我遇到的問題是期望腳本能夠處理多個“期望”。 我需要說明4件事,我們的環境糟透了-請忍受。

  1. 帳戶正常,密碼需要輪換-這有效
  2. 帳戶已過期,密碼需要更改-這可行
  3. 帳戶已使用新密碼-尚未內置
  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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM