LINUX.ORG.RU

Проверка силы пароля средствами bash

 , ,


2

3

Здравствуйте.

Если у кого нибудь есть идеи как написать этот скрипт просьба помочь.

В общем нужно написать скрипт который будет принимать строку как пароль и проводить проверку на

  • минимальную длину 8 символов
  • хотя бы одна буква
  • хотя бы одна цифра
  • используется один из символов @,#,$,%,&,*,+,-,=

Мне сказали что можно написать все в одну строку командой set, но я пока не разобрался как, а время поджимает. Можно и не в одну строку, просто направьте где копать, а лучше хоть какой нибудь пример. Спасибо за понимание.



Последнее исправление: beastie (всего исправлений: 1)

Может просто сразу генерировать их pwgen'ом?

saahriktu ★★★★★
()

Вы это себя контролировать собрались? Если других, то для вас уже готов специальный котел в аду.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Нет, контролировать никого не собирался, просто такое задание. Практического применения этот скрипт возможно и не имеет, просто нужно сделать скрипт именно средствами bash для проверки пароля.

unitready
() автор топика

Мне нравится ход ваших мыслей, ибо я сам такой же извращенец. Давайте я помогу вам поизвращаться над башем и над местными админами. Повторяйте за мной:

ps=`echo "435Gdf-3+=534+++34-5 dfg dfg ddf 345" | sed 's/[^a-zA-Z0-9@#$%&*+-=]//g'`; if  [[ $ps =~ ([0-9]+) ]] && [[ $ps =~ ([a-z]+) ]] && [[ $ps =~ ([A-Z]+) ]] && [[ $ps =~ ([@#$%&*+-=]+) ]] && [[ ${#ps} -ge 8 ]]; then echo "password_valid" else echo "password_unvalid" fi
А еще, это в одну строку :)

znenyegvkby
()
Ответ на: комментарий от das_tier

Граммар-наци в треде, все в словарь!
//Странно что вы вообще этот бред до конца прочитали :)

znenyegvkby
()
Ответ на: комментарий от Norong

А я вот в такие комиксы не верю, ибо перебор по словарю, значит слова из словаря использовать никак нельзя.

unt1tled ★★★★
()

минимальную длину 8 символов

ok

хотя бы одна буква, хотя бы одна цифра, используется один из символов @,#,$,%,&,*,+,-,=

Don't be that guy. If you do it, screw you!

beastie ★★★★★
()

Ну, не однострочник, но «можно сделать» (особенно, если убрать вывод сообщений):

#!/bin/bash
pwi="$1"
rms=0
pw="${pwi:8}"
test "$pw" || { echo \""$pwi"\": shorter than 8 characters 1>&2 ; let rms="$rms|1" ; }
pw="${pwi//[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]/}"
test "$pw" || { echo \""$pwi"\": only alpha and/or digits 1>&2 ; let rms="$rms|2" ; }
pw="${pwi//[0123456789@#\$%\&*\+\-=]/}"
test "$pw" || { echo \""$pwi"\": only digits and/or symbols 1>&2 ; let rms="$rms|4" ; }
pw="${pwi//[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@#\$%\&*\+\-=]/}"
test "$pw" || { echo \""$pwi"\": only alpha and/or symbols 1>&2 ; let rms="$rms|8" ; }
exit $rms
exit code - число:

бит 0 - короче 8 символов;

бит 1 - не хватает символов;

бит 2 - не хватает букв;

бит 3 - не хватает цифр.

Не благодари.

berrywizard ★★★★★
()
Ответ на: комментарий от das_tier

ты меня опередила, рогатая лашатка.

Тред добавил в избранное, спасибо.

targitaj ★★★★★
()
Последнее исправление: targitaj (всего исправлений: 1)
Ответ на: комментарий от berrywizard

Это не парсер накрыло, это тебя накрыло, писать такое. :)

shell-script ★★★★★
()
Ответ на: комментарий от berrywizard

Предложили сделать ифами чтобы выводило что не так. Посмотрите пожалуйста мой скрипт, он не работает. Что в нем не так?

 
#!/bin/bash
echo "enter password"
read pas

if [[ $pas =~ ([0-9]+) ]]; 
	if [[ $pas =~ ([a-z]+) ]];
		if [[ $pas =~ ([A-Z]+) ]]; 
			if [[ ${#pas} -ge 8 ]];
				if [[ $pas =~ ([\@ \$ \# \% \& \* \+ \- \=]+) ]];
				then echo "password valid"
				else echo "no punctuation"
				fi
			else echo "too short"
			fi
		else echo "no capital letters"		
		fi
	else echo "no character"
	fi
else echo "no digits"
fi

unitready
() автор топика

«megapower» - сильный пароль, например

anonymous
()
Ответ на: комментарий от unitready

Вот такая ошибка

passwd.sh: line 13: syntax error near unexpected token `else'
passwd.sh: line 13: `			else echo "too short"'
unitready
() автор топика
Ответ на: комментарий от unitready

А ты вообще это запускал? Ошибки читал? В твоём варианте не хватает then в условиях и список знаков препинания неправильно задан. Но вообще такие здоровые вложенные куски if'ов - это ужасно. Особенно в отладке.

#!/bin/bash

echo "enter password"
read pas

if [[ $pas =~ ([0-9]+) ]]
then
    if [[ $pas =~ ([a-z]+) ]]
    then
        if [[ $pas =~ ([A-Z]+) ]]
        then
            if [[ ${#pas} -ge 8 ]]
            then
                if [[ $pas =~ ([@$#%&*+-=]+) ]]
                then
                    echo "password valid"
                else
                    echo "no punctuation"
                fi
            else
                echo "too short"
            fi
        else
            echo "no capital letters"       
        fi
    else
        echo "no character"
    fi
else
    echo "no digits"
fi
Так длинее, зато не надо искать какой if, после какого идёт и какой else к какому условию относится. Потом проще разобраться. Ну и те же if'ы можно покороче записать при желании - подробности в манах.
#=/bin/bash

echo "enter password"
read PASS

RESULT=''

if [[ $PASS =~ ([0-9]+) ]]
then
	RESULT=''
else
	RESULT="no digits"
	echo $RESULT
	exit 0
fi
if [[ $PASS =~ ([a-z]+) ]]
then
	RESULT=''
else
	RESULT="no character"
	echo $RESULT
	exit 0
fi
if [[ $PASS =~ ([A-Z]+) ]]
then
	RESULT=''
else
	RESULT="no capital letters"		
	echo $RESULT
	exit 0
fi
if [[ ${#PASS} -ge 8 ]]
then
	RESULT=''
else
	RESULT="too short"
	echo $RESULT
	exit 0
fi
if [[ $PASS =~ ([[:punct:]]+) ]]
then 
	RESULT=''
else
	RESULT="no punctuation"
	echo $RESULT
	exit 0
fi

echo "Password OK"
exit 0
А вообще, вот:
echo 'password' | sed -r '/[[:punct:]]/!d; /[[:lower:]]/!d; /[[:upper:]]/!d; /[[:digit:]]/!d; /.{8}+/!d; s/^.*$/OK/'

Если вернуло OK, значит всё нормально, если не вернуло ничего, значит чего-то не хватает. Как вывести, чего именно не хватает, можно оставить в качестве домашнего задания.

shell-script ★★★★★
()
Ответ на: комментарий от shell-script

Спасибо большое за развернутый и подробный ответ.

unitready
() автор топика
Ответ на: комментарий от Zmicier

Вы это себя контролировать собрались? Если других, то для вас уже готов специальный котел в аду.

Это его умения программировать на баше контролируют. А использует «помощь зала». Котёл, конечно, давно готов. Ему и всем, кто помогает.

Давно пора сделать раздел «Дай списать». Хотя, конечно, лучше банить.

anonymous
()
Ответ на: комментарий от unitready

По-моему, так некрасиво, или даже нечитабельно. Я бы накорябал так:

...
if [[ ! $pas =~ ([0-9]+) ]]; then echo no digits; exit; fi
if [[ ! $pas =~ ([a-z]+) ]]; then echo no lower alpha; exit; fi
...

Так проверка и сообщение об ошибке рядом. Ещё короче, как у меня:

...
test ! $pas =~ ([0-9]+) && { echo no digits; exit; }
test ! $pas =~ ([a-z]+) && { echo no lower alpha; exit; }
...

но это уже уклон в перловщину.

PS: у меня «$pas =~ ([0-9]+)» не работает, GNU bash, version 4.2.46(1)-release (x86_64-redhat-linux-gnu)

berrywizard ★★★★★
()
Ответ на: комментарий от beastie

Don't be that guy. If you do it, screw you!

отличный пароль

SevikL ★★★★★
()

john the reaper — очень годно

int13h ★★★★★
()
Ответ на: комментарий от anonymous

Это его умения программировать на баше контролируют. А использует «помощь зала». Котёл, конечно, давно готов. Ему и всем, кто помогает.

Давно пора сделать раздел «Дай списать». Хотя, конечно, лучше банить.

anonymous (17.03.2016 22:02:45)

Откуда столько негатива?

Насколько я знаю подобные форумы и нужны для обмена опытом. Что плохого в том что нуб просит совета гуру в вопросе в котором он пока плохо разбирается?

unitready
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.