使用expect设置OS X密码

问题描述 投票:0回答:3

我正在尝试编写一个脚本来将 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

运行没有错误,但什么也不做;经理帐户的密码保持不变。我都试过了 和 但这没有任何区别。谁能看到我做错了什么或我遗漏了哪些步骤?

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

macos shell expect change-password
3个回答
1
投票

只需在最后添加一条

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}
}

0
投票

事实证明

dscl . passwd /Users/manager [passwordstring] 

比尝试将 passwd 与 Expect 结合起来更好/更容易。希望这对其他人有帮助。


0
投票
抱歉复活,但是在 macOS 上使用 passwd 命令更改 OpenDirectory 中的密码时,请使用:

passwd -i opendirectory [用户]

© www.soinside.com 2019 - 2024. All rights reserved.