私は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ではなく期待から派生したので、これは特に驚くべきことです。私は過去2時間でこれを見つけようとしました。誰でも私を助けることができますか?
答え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"
!
}
「!」で始まる行に注意してください。インデント、余分な空白やコメントなどがあってはならず、行の最初で唯一の文字でなければなりません。