如何处理期望脚本中来自 passwd 的错误?



我正在尝试创建一个期望脚本来非交互式地更新用户的密码。新的预期和外壳脚本。我希望能够捕获和处理遇到的错误。例如,如果我正常运行 passwd,并且由于某种原因我的新密码不可接受,我可能会看到类似"密码错误:密码与旧密码太相似"的消息。 问题是,在期望脚本中,在使用无效密码发送 $new_pswd\r 后,期望"错误密码:*"失败,因为 passwd 的下一个输出是"。 我想捕获错误的密码和消息,以便我可以将它们返回到调用过程。 这里的用例是允许可能拥有多个帐户的个人用户一次性使用相同的密码更新其所有帐户。将为每个帐户调用一次此脚本。

#!/usr/bin/expect -df
# THIS SCRIPT WON'T WORK
set old_pswd $::env(PSWD1)
set new_pswd $::env(PSWD2)
spawn passwd
expect "*ssword:" { send "$old_pswdr" }
expect "*ssword:" { send "$new_pswdr" }
expect {
"*ssword:" {
puts "Expectedr"
send "$new_pswdr"
exit 0
}
"BAD PASSWORD:*" {
puts "BAD PASSWORDr"
send x03
exit 1
}
"*" {
puts "Unexpectedr"
send x03
puts $expect_out(buffer)
exit 1
}
}

更新:从昨天开始,我学到了很多关于期望的知识,并最终解决了脚本中的问题和其他几个问题。

第一个问题是我期待冒号后没有空格的密码提示,因此所有后续的 expect 命令都试图与尚未使用的空格字符匹配,该字符与"*"匹配,并在 passwd 发送其错误密码消息之前终止脚本。

第二个问题是试图匹配*ssword:在"错误密码"之前。输入新密码的提示始终在错误密码消息之前匹配,因为 passwd 正在发送"错误密码: 消息消息消息\r新密码:">

这是一个现在可以工作的脚本,它被包装在一个 su 中。无论调用此脚本,什么进程都需要在之后清理环境变量。这个想法是提前安全地设置这些凭据,以便不必在命令行上传递凭据。此脚本旨在从用户帐户中为属于他们的每个其他帐户调用一次:

#!/usr/bin/expect -f
# THIS SCRIPT WORKS
set old_pswd $::env(PSWD1)
set new_pswd $::env(PSWD2)
set new_user $::env(USER1)
spawn su $new_user
expect "*ssword: " { send "$old_pswdr" }
expect "$ " { send "passwdr" }
expect "*ssword: " { send "$old_pswdr" }
expect "*ssword: " { send "$new_pswdr" }
expect {
"BAD PASSWORD: " {
expect {
"dictionary"    { set exit_code 1 }
"shorter than"  { set exit_code 2 }
"too similar"   { set exit_code 3 }
"No password"   { set exit_code 4 }
"*"             { set exit_code 99 }
}
send x03
expect "$ " { send "exitr" }
exit $exit_code
}
"*ssword: " {
send "$new_pswdr"
expect "$ " { send "exitr" }
exit 0
}
}

最新更新