как генерировать только один специальный символ в этом генераторе пароля

awk '/\r$/ {sub(/\r$/, ""); printf "%s", $0; next} {print}' file
.
1
19.09.2014, 21:13
3 ответа

Просто измените вашу команду голову на -c 1:

# Generate a random password
#  $1 = number of characters; defaults to 32
#  $2 = include special characters; 1 = yes, 0 = no; defaults to 1
function randpass() {
  [ "$2" == "0" ] && CHAR="[:alnum:]" || CHAR="[:graph:]"
    cat /dev/urandom | tr -cd "$CHAR" | head -c 1
    echo
}
0
27.01.2020, 23:38

Вот несколько подходов:

1. Итерируйте, пока не получите пароль, который вам «нравится»

while true
do
    word=$(tr -cd "[:graph:]" < /dev/urandom | head -c ${1:-32})
    if [[ "$word" =~ [[:punct:]].*[[:punct:]] ]]
    then
        echo "$word has multiple special characters - reject."
        continue
    fi
    if [[ "$word" =~ [[:punct:]] ]]
    then
        echo "$word has one special character - accept."
        break
    fi
    echo "$word has no special characters - reject."
    continue
done

Предупреждение: это может занять много времени для большого количества символов (например,> 16).

2. Остановитесь после того, как вы получите один знак препинания

n=${1:-32}
if [ "$2" == "0" ]
then
    CHAR="[:alnum:]"
else
    CHAR="[:graph:]"
fi
word=
for ((i=0; i<n; i++))
do
    thischar=$(tr -cd "$CHAR" < /dev/urandom | head -c 1)
    if ! [[ "$thischar" =~ [[:alnum:]] ]]
                            # Probably equivalent to if [[ "$thischar" =~ [[:punct:]] ]]
    then
        # Got one special character – don’t allow any more.
        echo "$thischar is a special character."
        CHAR="[:alnum:]"
    fi
    word="$word$thischar"
done
echo "$word"

Обратите внимание, что это получает специальный символ в первых трех (например, ab! defghijklmnopqrstuvwxyz123456 ) очень часто. Также теоретически можно получить пароль без специальных символов. используя этот подход.

1
27.01.2020, 23:38

Я думаю, что я бы генерирую 32 [: Alnum:] Персонажи сначала, а затем необязательно вставить специальный символ:

function randpass() {
  passwd=$( < /dev/urandom tr -cd "[:alnum:]" | head -c $1)
  if [ "$2" == "0" ]; then
    echo "$passwd"
  else
    spchar=$( < /dev/urandom tr -cd "[:punct:]" | head -c 1)
    pos=$((RANDOM%$1))
    echo "${passwd:0:pos}${spchar}${passwd:pos+1:$1}"
  fi
}

Я предполагаю, что [: punct :] Содержит все символы, которые вы считаете «особенным».

Синтаксис $ (()) Syntax является арифметическим расширением арифметического расширения , который генерирует случайное число от 0 до 31 (или что-то еще $ 1 .

$ {var: offset: длина} Синтаксис - это расширение параметра оболочки , чтобы вернуть подстроку из строки.

1
27.01.2020, 23:38

Теги

Похожие вопросы