Então, recentemente, tenho trabalhado em um pequeno script que fará o login em um host unix remoto e alterará sua senha, nunca tive muita experiência com o esperado, por isso tem sido uma curva de aprendizado ascendente.
O script que tenho até agora é o seguinte:
#!/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"}
A idéia é que isso irá automatizar um pequeno processo, mas o script vai até onde ele logou com sucesso no sistema e depois não oferece nada, não continua com a redefinição de senha, então essencialmente para depois do ssh.
UPDATE: Conseguido ultrapassar o problema da linha em branco usando "send -" \ r "" antes de executar o comando de redefinição de senha. O script agora é executado até a conclusão, mas insere claramente uma senha incorreta na segunda confirmação. Adicionou a saída abaixo:
::> 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
UPDATE 2:
Primeiramente, obrigado por sua ajuda até agora, troquei o script para o modo de depuração e o executei novamente, além de alterar a forma como as variáveis foram definidas.
Esta é a saída do modo de depuração, até onde eu possa ver as senhas necessárias são as mesmas, então eu não tenho certeza porque elas estão falhando.
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
Erro: as senhas não coincidem.