我正在尝试编写一个脚本来将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都试过了,但这没有任何区别。任何人都可以看到我做错了什么或我省略了哪些步骤?
(它将始终以管理员权限运行;这就是为什么没有'期望'旧密码:“'行。)
答案 0 :(得分:0)
最后再添加一个expect
语句,如下所示,
send "$mgrpassword\r"
expect eof
基本上,Expect
将使用两个可行的命令,例如send
和expect
。如果使用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结合起来更好/更轻松地工作很多。希望这有助于其他人。