Гораздо проще заменить все содержимое файла, чем изменить многострочную -строку в кавычках внутри файла, содержащего множество других вещей, которые вы не хотите ломать.
Попробуйте поместить содержимое $variable
в файл (, например. vfile.txt
), и пусть ваш сценарий оболочки сделает что-то вроде variable="$(cat vfile.txt)"
.
Затем вы можете использовать любой метод, который хотите заменить или изменить vfile.txt
.
Вы можете добавить специальные символы с другим shuf
, но не можете использовать расширение фигурных скобок и подобные диапазоны.
Но вы можете явно перечислить их, один за другим, в кавычках, чтобы защитить их от оболочки:
shuf -r -n2 -e '!' '"' '#' '$' % '&' '(' ')' '*' +, -. / : ';' '<' = '>' '?' @ '[' '\' ']' '^' _ '{' '|' '}'
Или вставьте их в строку и используйте разбиение по словам -, чтобы получить их в несколько аргументов. Однако необходимо отключить подстановку с помощью set -f
, иначе звездочка вызовет проблемы :
set -f
shuf -r -n2 -e $(sed -e 's/./& /g' <<< '!"#$%&()*+,-./:;<=>?@[\]^_{|}' )
(или просто сделайте то, что делают все, и добавьте два фиксированных специальных символа в конце разумного пароля, достаточно длинного даже без них.)
Чтобы убедиться, что у вас есть буква в качестве первого символа, проще всего просто добавить ее отдельно и перетасовать символы только остальной части пароля. Например. это создаст пароль из двух частей, первая будет состоять из одной буквы (в верхнем или нижнем регистре ), вторая — это то, что вы указали в комментариях:
#!/bin/bash
set -f
pw=$(shuf -r -n1 -e {A..Z} {a..z})
pw="$pw$( { shuf -r -n4 -e {A..Z}; shuf -r -n4 -e {a..z}; shuf -r -n4 -e {0..9}; shuf -r -n2 -e $(sed -e 's/./& /g' <<< '@%+\/!#$^?:.(){}[]-_.'); } | shuf | tr -d '\n' )"
echo "$pw"
Вывод будет примерно таким:
$ bash pw.sh
WRgpJ7pP%Tj60.1
$ bash pw.sh
oV6N#7s4Po3Bt)r
Взгляните на Как сгенерировать случайную строку?
Герберт предлагает использовать/dev/urandom
tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~' </dev/urandom | head -c 13 ; echo
400 Кот предлагает раствор сopenssl
openssl rand -base64 12
Проблема в том, что ни одно из этих решений не гарантирует, что у вас будут все символы (, то есть 2 цифры, 2 специальных символа и т. д. ), которые вы хотите.
С shuf
и на основе исходного кода вы можете сделать что-то вроде
shuf -r -n1 -e {a..z} {A..Z} | tr -d $'\n'; { shuf -r -n2 -e {0..9}; shuf -r -n2 -e {a..z}; shuf -r -n2 -e {A..Z}; shuf -r -n2 -e { \! \" \# $ % \& '\' '/' \( \) \{ \} [ ] \< \> + - =., : \; ? @ \| \` \~ ^ _ "'" \* }; } | shuf | tr -d $'\n'
Разделено на строки для удобства чтения:
shuf -r -n1 -e {a..z} {A..Z} | tr -d $'\n';
{ shuf -r -n2 -e {0..9};
shuf -r -n2 -e {a..z};
shuf -r -n2 -e {A..Z};
shuf -r -n2 -e { \! \" \# $ % \& '\' '/' \( \) \{ \} [ ] \< \> + - =., : \; ? @ \| \` \~ ^ _ "'" \* }; } | shuf | tr -d $'\n'
Что создаст строку, начинающуюся с буквы (обратите внимание, что я не передаю первую строку в последнююshuf
)и имею 2 строчных буквы,2 заглавные буквы и 2 цифры (всего 9 символов)
В конце концов, это последняя команда:
export PASSWORD=$(shuf -r -n1 -e {A..Z} {a..z})$( { shuf -r -n4 -e {A..Z}; shuf -r -n4 -e {a..z}; shuf -r -n4 -e {0..9}; shuf -r -n2 -e $(sed -e 's/./& /g' <<< '@%+\/!#$^?:.(){}[]-_.'); } | shuf | tr -d '\n' )