0

I am writing a password check script and I would like to be able to check if password includes a string of 3 or more of the same characters (aaa, babbb, asj111) all would be a "bad password". I have tried grep -E '(.)\1{2,}' $password but I want this in an if statement to then do something if I find more than 3 characters. All help is appreciated!

Jade Fisher
  • 143
  • 10
  • Usually passwords are stored in hashed form. Why do you think the hash will be "better" if you do not have same characters? – Romeo Ninov Sep 12 '18 at 16:08
  • Possible duplicate of [Regular expression to match any character being repeated more than 10 times](https://stackoverflow.com/questions/1660694/regular-expression-to-match-any-character-being-repeated-more-than-10-times) – Alex M Sep 12 '18 at 16:09
  • @AlexM it's not a duplicate; the question here is about how to combine `grep` and an `if` statement, not about the regex (the OP got that point right). – gniourf_gniourf Sep 12 '18 at 16:10
  • @RomeoNinov yes this is a simple project I am doing to become familiar with shell scripting and learning the basics for it and understanding how it works – Jade Fisher Sep 12 '18 at 16:11
  • 1
    @JadeFisher, OK. But when write scripts always have security in mind – Romeo Ninov Sep 12 '18 at 16:12
  • 1
    `3ksad9jdsaaa9324jk` is probably a much better password than `aabbcc`. Encourage your users to use longer passwords instead of nitpicking about arbitrary restrictions on shorter ones. – chepner Sep 12 '18 at 18:58
  • @chepner I have no users this is for me to understand shell coding... – Jade Fisher Sep 13 '18 at 14:09

2 Answers2

3

Use the return code of grep:

if grep -q '\(.\)\1\1' <<< "$password"; then
    echo "Bad password!"
    # Do something, like exit 1
fi

The -q option is to keep grep quiet. I didn't use the -E (extended) option, use it if you want.

gniourf_gniourf
  • 44,650
  • 9
  • 93
  • 104
1

Put your pattern in a variable. It matches any character, then the same character twice again (so three times in total).

pattern='(.)\1{2}' 

Then test it with the bash regex comparison operator =~

[[ $password =~ $pattern ]] && echo "bad password"
Alex M
  • 885
  • 9
  • 12