使用expect设置OS X密码

时间:2015-10-23 19:20:58

标签: macos shell expect change-password

我正在尝试编写一个脚本来将OS X帐户的密码更新为旋转的集中存储值。作为学习使用tclcurl的前奏,我只想让这个原型脚本工作:

#!/usr/bin/expect

set mgrpassword "newpassword"  # this will become a tclcurl command later

spawn passwd manager
expect "New password:"
send "$mgrpassword\n"
expect "Retype new password:"
send "$mgrpassword\n"

puts "\nManager password changed."

exit 0

它运行没有错误,但它什么也没做;经理帐户的密码保持不变。我用\ r和\ n都试过了,但这没有任何区别。任何人都可以看到我做错了什么或我省略了哪些步骤?

(它将始终以管理员权限运行;这就是为什么没有'期望'旧密码:“'行。)

2 个答案:

答案 0 :(得分:0)

最后再添加一个expect语句,如下所示,

send "$mgrpassword\r"
expect eof

基本上,Expect将使用两个可行的命令,例如sendexpect。如果使用send,则必须在之后拥有expect(在大多数情况下)。 (反之亦然,不要求是强制性的)

这是因为如果不这样做,我们将错过生成过程中发生的事情,因为Expect将假设您只需要发送一个字符串值而不期望会话中的任何其他内容。

您的脚本也可以通过以下方式编写,这样可以使用exp_continue使其更加健壮。它会使Expect再次运行。

set mgrpassword "newpassword"
spawn passwd manager
expect {
        timeout { puts "Timeout happened";exit 0}
        "password:" {send "$mgrpassword \r";exp_continue}
        eof {puts "Manager password changed"; exit 1}
}

答案 1 :(得分:0)

事实证明

dscl . passwd /Users/manager [passwordstring] 

比尝试将passwd与expect结合起来更好/更轻松地工作很多。希望这有助于其他人。