Мы должны поместить строку в кавычки, чтобы оценить их как строки. Если мы попытаемся оценить строку со встроенным дефисом (-), оболочка будет рассматривать ее как вариант для проверки, но не как строку. Для получения дополнительной информации об операторах вы можете проверить это здесь
Вы можете получить случайные байты криптографического -качества из /dev/urandom
. (Он существует с Solaris 9. Он также существует в Linux. )Сюда входят непечатаемые символы, поэтому их необходимо удалить. Следующая команда извлекает 10 случайных печатных символов ASCII без пробела -.
</dev/urandom tr -dc '!-~' | dd ibs=1 obs=1 count=10
Я не рекомендую использовать в паролях специальные символы. Они не делают пароли более безопасными. Что делает пароль безопасным, так это его энтропия. Пароль из 10 -символов имеет 10×log 2(94 )≈ 65,5 бит энтропии. Вы можете получить такое же количество энтропии из 9 произвольных байтов и закодировать их как хотите, например, как шестнадцатеричное.
</dev/urandom dd ibs=1 obs=1 count=9 | od -tx1 -An | tr -d ' '
Или как Base64, что короче.
</dev/urandom dd ibs=1 obs=1 count=9 | uuencode -m - | sed -n 2p
Если есть какое-то жесткое ограничение, что «пароли должны содержать хотя бы один специальный символ» (, что является сомнительным способом сделать пароли , выбираемые обычными людьми более безопасными, и совершенно неверно для случайно генерируемых passwords ), то вы не можете просто использовать случайный пароль, потому что есть шанс, что он не будет содержать ни одного символа в требуемом классе. Если вы отклоняете пароли, которые не соответствуют ограничениям, вы снижаете безопасность пароля. Вместо этого сделайте пароль длиннее, например.
</dev/urandom dd ibs=1 obs=1 count=9 | uuencode -m - | sed '2!d; s/$/-Aa1/'
Если вам нужно, чтобы пароль запоминался, это другая проблема. Лучше всего запоминаются пароли кодовые фразы .