如何处理expect脚本中passwd的错误?

如何处理expect脚本中passwd的错误?,expect,passwd,Expect,Passwd,我正在尝试创建一个expect脚本,以非交互方式更新用户的密码。新的期望和shell脚本。我希望能够捕获和处理遇到的错误。例如,如果我正常运行passwd,并且由于某种原因我的新密码不可接受,我可能会看到类似“密码错误:密码与旧密码太相似”的消息。 问题是,在expect脚本中,在使用无效密码发送$new\u pswd\r后,expect“BAD password:*”失败,因为passwd的下一个输出是“”。 我想捕获错误的密码和消息,以便将它们返回到呼叫过程。 这里的用例是允许可能拥有多个帐

我正在尝试创建一个expect脚本,以非交互方式更新用户的密码。新的期望和shell脚本。我希望能够捕获和处理遇到的错误。例如,如果我正常运行passwd,并且由于某种原因我的新密码不可接受,我可能会看到类似“密码错误:密码与旧密码太相似”的消息。 问题是,在expect脚本中,在使用无效密码发送$new\u pswd\r后,expect“BAD password:*”失败,因为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_pswd\r" }
expect "*ssword:" { send "$new_pswd\r" }
expect {
        "*ssword:" {
                puts "Expected\r"
                send "$new_pswd\r"
                exit 0
        }
        "BAD PASSWORD:*" {
                puts "BAD PASSWORD\r"
                send \x03
                exit 1
        }
        "*" {
                puts "Unexpected\r"
                send \x03
                puts $expect_out(buffer)
                exit 1
                }
        }

更新:从昨天开始,我学到了很多关于expect的知识,最终解决了这个问题,还解决了脚本中的一些其他问题。

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

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

下面是一个脚本,现在可以使用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_pswd\r" }

expect "$ " { send "passwd\r" }
expect "*ssword: " { send "$old_pswd\r" }
expect "*ssword: " { send "$new_pswd\r" }

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 "exit\r" }
                exit $exit_code
        }
        "*ssword: " {
                send "$new_pswd\r"
                expect "$ " { send "exit\r" }
                exit 0
        }
}

更新:从昨天开始,我学到了很多关于expect的知识,最终解决了这个问题,还解决了脚本中的一些其他问题。

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

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

下面是一个脚本,现在可以使用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_pswd\r" }

expect "$ " { send "passwd\r" }
expect "*ssword: " { send "$old_pswd\r" }
expect "*ssword: " { send "$new_pswd\r" }

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 "exit\r" }
                exit $exit_code
        }
        "*ssword: " {
                send "$new_pswd\r"
                expect "$ " { send "exit\r" }
                exit 0
        }
}

我不明白失败的原因。你能发布一些错误密码的调试输出吗?谢谢你的帮助,格伦!我确实设法弄明白了。解决方案作为答案发布。我不理解失败案例。你能发布一些错误密码的调试输出吗?谢谢你的帮助,格伦!我确实设法弄明白了。解决方案发布为答案。