因此,最近我一直在开发一个小脚本,它将登录到远程unix主机并更改其密码,我对expect从来没有太多的经验,因此它是一个向上的学习曲线。
到目前为止,我掌握的脚本是:
#!/usr/bin/expect
#Setting variables based on their location in the original script call
set username [lrange $argv 0 0]
set password [lrange $argv 1 1]
set server [lrange $argv 2 2]
set port [lrange $argv 3 3]
set changeuser [lrange $argv 4 4]
set newpassword [lrange $argv 5 5]
set yesval yes
set prompt "::>"
set timeout 60
spawn ssh -p $port $username@$server 
match_max 100000
expect "yes/no" {
    send "yes\r"
    expect "*?assword" { send "$password\r" }
} "*?assword" { send "$password\r" }
expect "::>" {
    send_user "ssh connection succeeded\n"
} "*?assword" { send_user "\nssh connection failed due to wrong    password\n"; exit 2}
send -- "\r"
expect "::>" {send "security login password -username $changeuser\r "}
expect "Enter a new password:*" {send "$newpassword\r"}
expect "Enter it again:*" {send "$newpassword\r"}
expect "::>" {send "exit\r";send_user "\npassword change successful for    $changeuser\n"}
expect "Enter a new password:*" { send "exit\r";send_user "\npassword change not successful for $changeuser\n"}其想法是,这将自动化一个小进程,但脚本运行到它成功地登录到系统,然后什么也不提供,不会继续密码重置,因此基本上停止后,它的ssh。
UPDATE:在运行密码重置命令之前,通过使用"send -“”\r“来克服空行问题。脚本现在运行到完成,但在第二次确认时,它显然输入了错误的密码。增加了以下产出:
::> ssh connection succeeded
::> security login password -username ######
Enter a new password:
Enter it again:
Error: Passwords didn't match.
::>
password change successful for ######
exit
Goodbye更新2:
首先,感谢你们的帮助,到目前为止,我把脚本切换到调试模式,并再次运行,并更改了变量的设置方式。
这是调试模式的输出,据我所见,所需的密码都是相同的,所以我不知道它们为什么失败。
expect: set expect_out(0,string) "Enter a new password: "
expect: set expect_out(spawn_id) "exp5"
expect: set expect_out(buffer) " security login password -username user\r\n\r\nEnter a new password: "
send: sending "Passtest123\r" to { exp5 }
expect: does "" (spawn_id exp5) match glob pattern "Enter it again:*"? no
Enter it again:
expect: does "\r\nEnter it again: " (spawn_id exp5) match glob pattern "Enter it again:*"? yes
expect: set expect_out(0,string) "Enter it again: "
expect: set expect_out(spawn_id) "exp5"
expect: set expect_out(buffer) "\r\nEnter it again: "
send: sending "Passtest123\r" to { exp5 }
expect: does "" (spawn_id exp5) match glob pattern "Error: Passwords didn't match.*"? no
expect: does "\r\n" (spawn_id exp5) match glob pattern "Error: Passwords didn't match.*"? no错误:密码不匹配。
发布于 2018-03-20 13:52:01
不是回答,而是需要格式化的注释:获取脚本参数的方式微妙地错了。lrange返回一个列表,当您对一个列表进行字符串化时,一些特殊字符将被转义。这将影响您发送的密码。取而代之的是这样做:
set username [lindex $argv 0]
set password [lindex $argv 1]
set server [lindex $argv 2]
set port [lindex $argv 3]
set changeuser [lindex $argv 4]
set newpassword [lindex $argv 5]或
lassign $argv username password server port changeuser newpassword既然你发送了相同的可能错误的密码两次,我不明白你为什么会收到这个错误。添加调试可能会暴露问题。
https://unix.stackexchange.com/questions/432257
复制相似问题