このシェルスクリプト(パスワードの確認)ではまだ問題が発生しており、解決策を見つけましたが、まだ正しい解決策が見つかりませんでした。
#!/bin/sh
echo "enter the password"
read password
len="${#password}"
if test $len -ge 8 ; then
echo "$password" | grep -q [A-Z]
echo "$password" | grep -q [a-z]
echo "$password" | grep -q [0-9]
if test $? -eq 0 ; then
echo "Strong password"
else
echo "Weak password"
fi
else
echo "password lenght should be greater than or equal 8"
fi
このスクリプトの結果は次のとおりです。
# ./password.sh
enter the password
12345678
Strong password >> Not as I expected which is should be weak password
私のせいは何ですか?
答え1
何:
read
なしで使用するとパスワードが-r
難しくなります。\
正規表現を引用しないと、シェルはそれをワイルドカードパターンとして扱い、ファイル名に展開されます。
この
$?
変数は最後の終了状態のみを保持しますgrep
。
以下を考慮してくださいbash
スクリプト:
#!/bin/bash
read -r -p "password:" -s password
if (( ${#password} < 8 )); then
echo "Passwords need 8 or more characters"
exit 1
fi
has_upcase=0
has_locase=0
has_digit=0
has_other=0
case "$password" in
*[[:upper:]]*) has_upcase=1 ;;&
*[[:lower:]]*) has_locase=1 ;;&
*[[:digit:]]*) has_digit=1 ;;&
*[^[:alnum:]]*) has_other=1 ;;
esac
if (( !has_upcase )); then
echo "Make sure you password has at least one upper-case letter"
elif (( !has_locase )); then
echo "Make sure your password has at least one lower-case letter"
elif (( !has_digit )); then
echo "Make sure your password has at least one digit"
elif (( !has_other )); then
echo "Make sure your password has at least non-alphanumeric character"
else
echo "Your password is ok"
fi
私はテストに「英数字ではない」要件を自由に追加しました。
ofはユーザーにプロンプトを出し、入力した内容をエコーすることなく読むことができますread
。bash
このcase
ステートメントは、入力されたパスワードに1つの大文字、1つの小文字、1つの数字、1つ以上の英数字以外の文字が含まれていることを確認します(次の使用)。POSIX 文字クラス)。;;&
各行の末尾のファンキーな外観は、「次のパターンをテストするためにこの文字列を使い続ける」という意味です。
sh
POSIXバリアントを取得するには、次のようread
に置き換えます。
stty -echo
printf "password: "
read -r password
stty echo
printf "\n"
そしてcase
同様の声明
case "$password" in *[[:upper:]]*) has_upcase=1 ;; esac
case "$password" in *[[:lower:]]*) has_locase=1 ;; esac
case "$password" in *[[:digit:]]*) has_digit=1 ;; esac
case "$password" in *[^[:alnum:]]*) has_other=1 ;; esac
残りはまだPOSIXでなければなりません。
答え2
呼び出しgrep
は順番に実行され、スクリプトの最後の呼び出し$?
と同じです。grep
各作業の後、次のようなものを使用したいと思いますgrep
。
retCodes=0
echo "$password" | grep -q "[A-Z]"
retCodes=$(($retCodes + $?))
echo "$password" | grep -q "[a-z]"
retCodes=$(($retCodes + $?))
echo "$password" | grep -q "[0-9]"
retCodes=$(($retCodes + $?))
これif [[ $retCodes -eq 0 ]]; then ...
答え3
おそらくこれが役に立ちます:
#!/bin/sh
echo "enter the password"
read -r password
caps="$(echo "$password" | sed 's/[^A-Z]//g')"
lowers="$(echo "$password" | sed 's/[^a-z]//g')"
numbers="$(echo "$password" | sed 's/[^0-9]//g')"
if [ "${#password}" -lt 8 ]; then
echo "password lenght should be greater than or equal 8"
else
echo "caps=${#caps} lowers=${#lowers} numbers=${#numbers}"
if [ "${#caps}" -ge 1 ] && [ "${#lowers}" -ge 1 ] && [ "${#numbers}" -ge 1 ]; then
echo "Strong password"
else
echo "Weak password"
fi
fi