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

У меня есть команда, которая генерирует пароль с несколькими специальными символами. Как я могу заставить его генерировать только 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:-32} echo } 

3 Solutions collect form web for “как генерировать только один специальный символ в этом генераторе паролей”

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

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" , 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" , 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 ). Кроме того, теоретически можно получить пароль без специальных символов, используя этот подход.

Я думаю, что сначала я сгенерировал 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:] содержит все символы, которые вы считаете «специальными».

Синтаксис $(( )) – это арифметическое расширение оболочки, которое генерирует случайное число от 0 до 31 (или любое другое значение $1 ).

Синтаксис ${var:offset:length} – это расширение параметра оболочки для возврата подстроки из строки.

Просто измените команду head на -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 } 
  • Распечатайте все приведенные ниже строки после совпадения
  • Как while цикл выполняется в сценарии оболочки для условия FALSE?
  • Перезаписать определенную строку в файле 2 с содержимым файла 1
  • Сценарий оболочки на основе TPS
  • Загрузка выходного текста без файлов записи
  • Работа с оператором if
  • Отправить письмо от сценария оболочки
  • как grep имена файлов на основе даты
  • Присвоение значений массива переменной
  • Использование хеша в сценариях оболочки
  • Почему printf выводит больше аргументов, чем ожидалось?
  • Interesting Posts

    Команды, вставленные в терминал, усекаются

    mutt: мусорный макрос

    Как использовать awk для печати, если значение столбца имеет четное число

    Есть ли способ установить Nano на CoreOS?

    Невозможно использовать sudo и другие приложения

    Могу ли я автоматизировать сбор share cifs без сохранения моего пароля в открытом виде?

    Устранение клонирования настроенного сервера RHEL, размещенного в центре обработки данных удаленно

    Как я могу подсчитать время, в течение которого система systemd должна загружать цель по умолчанию, а затем нарисовать ее?

    Установка Debian через сеть (не Интернет)

    Как удалить строку, если она начинается с. или a> с помощью sed?

    Loop, чтобы применить команду к 300 файлам в каталоге и переименовать вывод, включая исходное имя входного файла плюс новый текст

    как проверить, используется ли таблица mysql или приложение обращается к таблице в сценарии оболочки?

    Как файлы исправления rsync, когда есть разница в середине?

    Способ Unix для отправки / передачи необработанного Ethernet-фрейма

    Ошибка ввода / вывода, когда rm / mkdir

    Linux и Unix - лучшая ОС в мире.