명령줄 스크립트를 기대하고 있습니다.

명령줄 스크립트를 기대하고 있습니다.

저는 Linux 관리자가 사용자의 비밀번호를 신속하게 변경할 수 있는 스크립트를 작성 중입니다.

#!/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

그런데 자동으로 비밀번호가 입력될 것으로 예상되는 부분이 에디터에서 강조표시가 되지 않고 동작하지 않습니다. 텍스트를 수동으로 입력하라는 메시지가 계속 나타납니다. 스크립트가 bash가 아닌 기대에서 파생되었기 때문에 이는 특히 놀랍습니다. 나는 지난 두 시간 동안 이것을 알아내려고 노력해 왔습니다. 누구든지 나를 도와줄 수 있나요?

답변1

Expect와 bash 코드를 혼합하고 있습니다. 귀하의 스크립트는 대부분 bash 스크립트이므로 맨 위 줄을 다음 #!/bin/bash줄로 바꿉니다.

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

mychangepw예상되는 매개변수, 즉 현재 사용자, sudo 비밀번호, 변경할 사용자 및 해당 비밀번호를 사용하여 함수를 호출합니다.

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

스크립트의 시작 부분에 함수를 추가하고 이를 사용하여 기대하는 인수를 stdin의 "!" 줄까지 전달합니다.

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"
!
}

"!"로 시작하는 줄에 주의하세요. 들여쓰기나 추가 공백이나 주석 등이 없어야 하며 줄의 첫 번째이자 유일한 문자여야 합니다.

관련 정보