Espere script para ssh em um host remoto e mude sua senha

1

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.

    
por L Morgan 20.03.2018 / 09:36

1 resposta

0

Não é uma resposta, mas um comentário que precisa ser formatado: a maneira como você está recebendo os argumentos do script está sutilmente errada. lrange retorna uma lista , e quando você restringe uma lista, alguns caracteres especiais serão escapados. Isso afetaria a senha que você envia. Faça isso:

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]

ou

lassign $argv username password server port changeuser newpassword

Como você envia a mesma senha possivelmente errada duas vezes, não vejo por que você está recebendo esse erro. Adicionar depuração pode revelar o problema.

    
por 20.03.2018 / 14:52