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

У меня есть команда, которая генерирует пароль с несколькими специальными символами. Как я могу заставить его генерировать только 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 } 
  • Можно ли перечислить все файлы, имеющие по крайней мере 3 буквы на его имени?
  • Можно ли заменить «затем» на скобки?
  • В чем смысл $ * в сценарии оболочки?
  • Хранить задержанный вывод оболочки в переменную?
  • Установить переменную на случайный элемент в массиве
  • Изменение формата даты и добавление к исходному файлу
  • Как создать каталог, объединив два имени?
  • Начальный сценарий
  • помощь в создании sh
  • Перенаправить вывод команды в два разных файла
  • Скрипт для создания другого скрипта обрабатывает все файлы в последовательности?
  • Interesting Posts

    Разветвление безопасности использования этой строки в visudo: yourUSERname ALL = (otherUSERaccount) NOPASSWD: ALL

    Разрешить пользователям, не являющимся root, монтировать кеперизованную долю CIFS только в своем доме

    Защищать файлы приложений от доступа одним и тем же пользователем

    Добавление значений в переменные среды из Emacs

    Rosewill RC-212 и Fedora 15

    Как включить локацию и очередь создания базы данных?

    Почему я не могу использовать расширение вкладки / автозаполнение переменных оболочки с помощью cd?

    Невозможно запустить сценарий tmux при загрузке

    В чем разница между eval и exec?

    Невозможно использовать «userpace» cpufreq-регулятор и установить частоту процессора

    Команда для хранения строк с определенной длиной в файле

    Sed Использование: Добавить shebang отсутствует в первой строке скрипта

    Переупорядочение строк в linux

    Виртуальная бокс-машина, Созданная в Windows, работает на Linux?

    Почему Terminal и Shell являются двумя отдельными программами в Linux?

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