expectを使用してpasswdに$ PASSWORD変数の内容を渡そうとしています。これは動作するように見えますが、ユーザを追加しますが、ユーザの一人とsshでログインしようとすると、うまく動作しません。私が手動でパスワードを設定しても、うまくいきます。expectはbashスクリプトのpasswdに入力を渡しません
以前にこの問題が発生しましたか?
USERS=(user1 user2 user3)
generatePassword()
{
pwgen 16 -N 1
}
# Check if user is root
if [ $(whoami) != 'root' ]; then
echo "Must be root to run $0"
exit 1;
fi
# Check if pwgen is installed:
if [[ $(dpkg -s pwgen > /dev/null 2>&1; echo ${PIPESTATUS}) != '0' ]]; then
echo -e "pwgen is not installed, this script will not work without it\n\n'apt-get install pwgen'\n"
exit 1;
else
echo -e "Starting Script...\n\n"
fi
# Iterate through users and add them with a password
for i in ${USERS[@]}; do
PASSWORD=$(generatePassword)
echo "$i $PASSWORD" >> passwords
useradd -m "${i}"
echo -e "Adding $i with a password of '$PASSWORD'\n"
expect -c "
spawn passwd ${i}
expect \"Enter new UNIX password:\"
send -- \"$PASSWORD\r\"
send -- \"\r\"
expect \"Retype new UNIX password:\"
send -- \"$PASSWORD\r\"
send -- \"\r\"
"
echo -e "\nADDED $i with a password of '$PASSWORD'\n"
done
Ewww。コードとして解析する予定のコンテンツに対して文字列置換を実行していますか?これは重要なコードの匂いです。ユーザーが自分のパスワードを設定できるようになった場合、これは任意のコマンドインジェクションの脆弱性として使用できます。 –
BTW、環境変数名(したがって名前空間を共有するシェル変数の名前)に関するPOSIXの規則については、http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.htmlを参照してください。 - すべて大文字の名前はシェルまたはオペレーティングシステムに意味を持つ変数によって使用され、少なくとも1つの小文字の名前は、アプリケーション使用のために予約されています。したがって、誤ってOSに意味のある変数を上書きしないように、 'PASSWORD'ではなく' password'を考慮してください。 –
@CharlesDuffy - 私は知っている、これは無知の中で一時間の結果です!もっと良くしようとしているIm – Detnon