否定予測を使用して特定の特殊文字を除外するBashパスワードの正規表現パターン

否定予測を使用して特定の特殊文字を除外するBashパスワードの正規表現パターン

次の条件でパスワード入力テンプレートを作成したいと思います。

  1. パスワードの長さは12文字以上でなければなりません。
  2. 少なくとも1つの小文字、1つの大文字、1つの数字、1つの特殊文字が必要です。
  3. 次の特定の特殊文字<>``````~許可されません。
  4. 最初の3つの条件が満たされる限り、順序は重要ではありません。

私はパターンを作るために否定的な予測を利用しましたが、うまくいきません。私のパターン:

^(.{0,11}|[^0-9]*|[^A-Z]*|[^a-z]*|[a-zA-Z0-9<>~`|"\']*|[^\s]*\s.*)$

オペレーティングシステム:Ubuntu 20.04

ベストアンサー1

あなたの質問は、表現をどのように使用しようとしているかについては言及していません。シェルの正規表現はbashPOSIX 拡張正規表現です。これは、ポジティブまたはネガティブなプレビューまたは振り返りをサポートしません。

式を使用してより多くのコンテンツを適用する代わりに、テストを複数の別々のテストに分割することをお勧めします。

すべてのタスクを実行するためにモンスターのような表現を作成しようとするよりも、各テストが独立して実行される場合は、実装を理解して維持するのが最も簡単です。

#!/bin/bash

pw_is_valid () {
        local avoid='[<>`"'"'"'~]'

        [ "${#1}" -ge 12 ] &&
        [[ $1 =~ [[:upper:]] ]] &&
        [[ $1 =~ [[:lower:]] ]] &&
        [[ $1 =~ [[:digit:]] ]] &&
        [[ $1 =~ [[:punct:]] ]] &&
        [[ ! $1 =~ $avoid ]]
}

until
        IFS= read -r -s -p 'Enter password: ' pw
        pw_is_valid "$pw"
do
        echo 'Try again' >&2
done

avoid正規表現[<>`"'~]を表現するために必要な参照数を減らすために、変数を使用して正規表現を維持します。

POSIX別名ロケールでは、CPOSIX[:punct:]文字クラスには次の文字セットの文字が含まれています。

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

一般領域には通常、より多くのコンテンツがあります。

ここでは「特殊文字」に代わって使用しています。


1 たとえば、Ubuntu 20.04 および en_GB.UTF-8 ロケールには、147495 個の異なる文字が含まれています。 YMMV は、システム、バージョン、およびロケールによって異なります。

おすすめ記事