awk '/\r$/ {sub(/\r$/, ""); printf "%s", $0; next} {print}' file
. Просто измените вашу команду голову
на -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 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).
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 :]
Содержит все символы, которые вы считаете «особенным».
Синтаксис $ (())
Syntax является арифметическим расширением арифметического расширения , который генерирует случайное число от 0 до 31 (или что-то еще $ 1
.
$ {var: offset: длина}
Синтаксис - это расширение параметра оболочки , чтобы вернуть подстроку из строки.