Создать случайную строку, где она должна иметь специальный символ в сценарии оболочки - PullRequest
0 голосов
/ 04 мая 2020

Я использую / dev / urandom для генерации специальной строки, но видел, что иногда специальный символ не включается в сгенерированную строку:

cat /dev/urandom | tr -dc 'a-zA-Z0-9$%&%' | fold -w 12 | head -n 1

Вывод: a8y34XFXC5ar

My Требуется, чтобы сгенерированный вывод строки (с помощью / dev / urandom) должен содержать один верхний регистр, один нижний регистр, один специальный символ и один символ цифры c.

Подскажите, пожалуйста, как выполнить это требование, если каждая сгенерированная строка должна соответствовать указанному требованию?

Ответы [ 3 ]

2 голосов
/ 04 мая 2020

Когда у вас должно быть 4 различных типа символов в выходных данных, сделайте 4 строки или массива (для каждого типа 1), используйте random, чтобы выбрать один символ из каждой строки / массива и добавьте его, как вы уже сделали, к длине 12 И shuf 12 символов, когда вы не хотите ограничивать возможные строки, имеющие 4 разных типа в качестве первых 4 символов.

Что-то вроде

printf -v small "%s" {a..z}
printf -v large "%s" {A..Z}
printf -v digit "%s" {0..9}
special='@#$%^&*+=<>?' # Edit: Single quotes, not double quotes

# Debug loop
for s in small large digit special; do
   echo "str=${!s}"
done

get4() {
   for s in small large digit special; do
      echo "${!s}" | sed 's/./&\n/g' | grep . | shuf | head -1
   done| tr -d '\n'
}

passw=$(echo "$(get4)$(cat /dev/urandom | tr -dc 'a-zA-Z0-9$%&%' | fold -w 8 | head -n 1)" |
   sed 's/./&\n/g' | grep . | shuf | tr -d '\n')


echo "${passw}"
* 1006. * После sed поток закончится двумя символами новой строки, нам нужен только один. Итак grep .
1 голос
/ 04 мая 2020

Один в awk:

awk '{
    for(i=1;i<=length();i++) {                               # read a line, iterate chars
        chr=substr($0,i,1)                                   # get a char
        if(chr~/[a-z]/&&(a<=2||((b>=1)&&(c>=1)&&(d>=1)))) {  # if in char class a-z
            str=str chr                                      # append
            a++                                              # keep count to get 
        }                                                    # ... from each class
        if(chr~/[A-Z]/&&(b<=2||((a>=1)&&(c>=1)&&(d>=1)))) {
            str=str chr
            b++
        }
        if(chr~/[0-9]/&&(c<=2||((a>=1)&&(b>=1)&&(d>=1)))) {
            str=str chr
            c++
        }
        if(chr~/[$%&]/&&(d<=2||((a>=1)&&(b>=1)&&(c>=1)))) {
            str=str chr
            d++
        }
        if(length(str)==12) {
            print str
            exit
        }
    }
}' /dev/urandom

Поскольку классы символов не имеют одинаковый размер, и только 3 допускается для каждого класса, прежде чем будут представлены все классы, случайное число, вероятно, смещено.

Этот получает принятые символы из /dev/urandom (ну, он читается из файла, поэтому, куда бы вы ни указали), и 'печатайте все совпадения, пока вы не нажмете Ctrl- c:

awk '{
    for(i=1;i<=length();i++) {
        chr=substr($0,i,1)
        if(chr~/[a-zA-Z0-9$%&]/)
            str=str chr
    }
    if(length(str)<12)
        next
    else
        for(i=1;i<=length(str)-11;i++) {
            sstr=substr(str,i,12)
            if(sstr~/[a-z]/ && sstr~/[A-Z]/ && sstr~/[0-9]/ && sstr~/[$%&]/){
                print substr(str,i,12)
                i+=11
            }
        }
    str=""
}' /dev/urandom
0 голосов
/ 06 мая 2020
openssl rand -base64 25

Измените 25 на любое количество случайных символов, которые вы хотите сгенерировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...