Esperar script para linha de comando

2

Estou escrevendo um script que permitirá que um administrador do Linux altere rapidamente as senhas de seus usuários.

#!/usr/bin/expect
# Check password for strength 
# ----------------------------------------------
read -p "What's your username?" current_user
read -p "What's the root password?" pass
read -p "How many users?" num
COUNTER=0
         while [  $COUNTER -lt $num ]; do
         let index=COUNTER+1
             read -p "Enter username$index : " user_$index
             let COUNTER=COUNTER+1 
         done
read -p "Enter password : " password
echo 
echo "Tesing password strength..."
echo
result="$(cracklib-check <<<"$password")"
okay="$(awk -F': ' '{ print $2}' <<<"$result")"
if [[ "$okay" == "OK" ]]
then
    echo "PASSWORD ACCEPTED"
    echo "Modifying User Passwords..."
    COUNTER=0
         while [  $COUNTER -lt $num ]; do
             let index=COUNTER+1
             tmp=user_$index
             echo "Changing Password for " ${!tmp}
             echo ${!tmp}
             sudo passwd ${!tmp}
             expect -exact "[sudo] password for $current_user: "
             send "$pass\r"
             expect -exact "New password: "
             send "$password\r"
             let COUNTER=COUNTER+1 
         done

    #echo "$user:$password" | usr/sbin/chpasswd
else
    echo "Your password was rejected - $result"
        echo "Try again."
fi

No entanto, a parte expect, que automatiza a entrada de senhas, não é destacada no meu editor e não funciona. Eu continuo recebendo prompts para inserir manualmente o texto. Isso é especialmente surpreendente, já que o script é sourcing, e não bash. Eu tenho tentado consertar isso nas últimas 2 horas. Alguém por favor pode me ajudar?

    
por cybercode23 06.09.2015 / 03:34

1 resposta

3

Você está misturando os códigos expect e bash. Seu script é principalmente um script bash, então substitua a linha superior por #!/bin/bash . Em seguida, substitua as linhas:

sudo passwd ${!tmp}
expect -exact "[sudo] password for $current_user: "
send "$pass\r"
expect -exact "New password: "
send "$password\r"

por uma chamada para uma função mychangepw com os argumentos que esperam necessidades, ou seja, o usuário atual, a senha sudo, o usuário a alterar e sua senha:

mychangepw $current_user "$pass" ${!tmp} "$password"

Adicione a função ao início do script e use-a para passe os args para esperar, com o script expect em stdin até a linha "!":

mychangepw(){
    expect -d - "$@" <<\!
    set current_user [lindex $argv 0]
    set sudopass [lindex $argv 1]
    set user [lindex $argv 2]
    set password [lindex $argv 3]
    spawn sudo passwd $user
    expect -exact "\[sudo\] password for $current_user: "
    send "$sudopass\r"
    expect -exact "New password: "
    send "$password\r"
!
}

Tenha cuidado com a linha que começa com "!". Deve ser o primeiro e único char da linha, sem recuo nem espaços em branco adicionais nem comentários, etc.

    
por 06.09.2015 / 09:46