Random Password Generator Bash
I am trying to make a password generator that generates a password between 8-16 characters. It also has to contain a digit and lower and uppercase letters, as well as only one special character that is randomly placed in the string when being generated. At the moment, my code will sometimes give me a password that does not meet the requirements eg. AOKOKKK@1 (no lowercase letters) In addition, I also need help to make it so that the special symbol only appears once in the password. How can I fix this? Here’s my code:
length=$[ 8 +$[RANDOM % 16]] char=(0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ! @ \# $ % ^ \&) max=$ for ((i = 1; i %$ password="$$" done echo $password
‘One special character’? Why? Password systems that limit the range of characters that can be used are endlessly frustrating. They make it really hard to make really good passwords.
Split the valid characters into groups: lower-case, upper-case, digits, specials. Decide on a random sequence of the 4 groups, only including the specials once. Or decide on a random sequence of the three main groups for ‘length-1’ groups; then decide on a random position for the specials within that list. Also check that each group is present at least once. Then for each character in the given length of password, generate a random specimen from the relevant group.
Do you need to do yourself as an exercise or you need a password generator? In Linux you can use pwgen ( sudo apt-get install pwgen on debian/ubuntu)
4 Answers 4
This guarantees one and only one special characters, as well as at least one of digits, lower case, and upper case. To place those characters randomly within the password, sort -R is used to scramble the order of characters before the password is printed:
#!/bin/bash choose() < echo $:1>; > < choose '!@#$%^\&' choose '0123456789' choose 'abcdefghijklmnopqrstuvwxyz' choose 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' for i in $( seq 1 $(( 4 + RANDOM % 8 )) ) do choose '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' done >| sort -R | tr -d '\n' echo ""
How it works
choose '!@#$%^\&' choose '0123456789' choose 'abcdefghijklmnopqrstuvwxyz' choose 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
for i in $( seq 1 $(( 4 + RANDOM % 8 )) ) do choose '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' done
Improvement
In the comments, JonathanLeffer shows that the output of sort -R is not fully random. sort -R sorts on a hash of each line. Apparently a random seed is added but each line receives the same seed. To get around this, the version below provides its own seed on each line. This is done by a change to the choose function. At the end, awk is used to remove those numbers and display the complete password:
#!/bin/bash choose() < echo $:1> $RANDOM; > < choose '!@#$%^\&' choose '0123456789' choose 'abcdefghijklmnopqrstuvwxyz' choose 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' for i in $( seq 1 $(( 4 + RANDOM % 8 )) ) do choose '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' done >| sort -R | awk '' echo ""
In awk , each line is divided into fields. The first field is the randomly chosen letter while the second is the random number that we added to seed the hash. The statement printf «%s»,$1 prints the first field (with no trailing whitespace) and ignores the second field. The end result is the password that we want.
Capturing the password to a variable
To capture the output to a variable, we use command substitution:
choose() < echo $:1> $RANDOM; > pass="$( < choose '!@#$%^\&' choose '0123456789' choose 'abcdefghijklmnopqrstuvwxyz' choose 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' for i in $( seq 1 $(( 4 + RANDOM % 8 )) ) do choose '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' done >| sort -R | awk '')"
Command substitution, denoted by $(. ) , runs the commands in the parens and captures their stdout.
Sysadminium
Рассмотрим, как можно сгенерировать случайный пароль в командной строке Linux. Будем использовать /dev/urandom и утилиты makepasswd, pwgen.
Используем /dev/urandom
При чтении устройство /dev/urandom возвращает бесконечный набор случайных байтов. Этот вывод можно отфильтровать с помощью утилиты tr. Затем, вывод передать команде xargs которая, по умолчанию выполняет команду echo и ей передается всё, что было прочитано из стандартного ввода. А с помощью утилиты head можно указать необходимое количество символов в пароле.
То есть сгенерировать пароль в Linux поможет следующая команда:
Вы можете сделать bash функцию и записать её в ваш .bashrc:
$ nano .bashrc genpasswd() < local l=$1 [ "$l" == "" ] && l=16 tr -dc A-Za-z0-9_ < /dev/urandom | head -c $| xargs >
Затем применим изменения и попробуем сгенерировать пароль:
$ . .bashrc ~$ genpasswd 5 Hbe7a $ genpasswd 10 PDbt1tjBg0
Используем makepasswd
Утилита makepasswd может также помочь сгенерировать пароль в Linux. Она также использует /dev/urandom, чтобы создавать случайные пароли. Вы можете установить её с помощью apt:
$ sudo apt install makepasswd
Просто выполните эту команду без параметров чтобы получить случайный пароль:
Можете указать количество символов в пароле с помощью опции chars и можете создать несколько паролей с помощью опции count:
$ makepasswd --chars 4 --count 3 1d65 R5Xe Lhes
Можно создать пароли и сразу вывести их зашифрованный хеш с помощью опции crypt-md5:
$ makepasswd --chars 4 --count 3 --crypt-md5 DWBN $1$awZ5uNo/$r50RTWsihcMKEVQzoDyoZ1 xLN7 $1$h4ThtOu1$Bsmqhr/Tq/IIdGPtAVGda. A2R2 $1$bss49Rj7$y.9nAbyr749N.eYRUF155.
Используем pwgen
Утилита pwgen генерирует легко запоминаемые пароли. Но также можешь генерировать случайные пароли. Устанавливается она также, с помощью apt:
Если выполнить её без опций, то вы увидите список из легко запоминаемых паролей:
$ pwgen Xu6Phei7 Ree2ud9e ohphah8I iiZ8Efoo foG0moh3 aSho2neL Phero4Ud thiCh9ei uvaeChu0 eeCie5Um Wovie0do Eibuo3Ou Sai1Ovah po3OhT9j XeYei9ei eiQu2mai mahSh9im sheyo0Ki ierooGh0 quai8Ieb aphe6Koo boh3uL8a daiR6ahy Laek9liy ooW9aedu Lei9aixe Doojah8k eeZie1ko ahp0Jab7 hieWe4io quohc1Qu zai4Aiwi boo1uDah ail1Ooth ohf8Boyo ip1mie4H Aijahth8 uaCh2De7 sahvooY2 Phie7eey si6Ahsog eit5Nea7 zuChoc9e Ohc1ui7c thae8aeG Nai5ahng ooLai8ei tohh2IFa tu2Ooy8o phe3eZan deequoG8 uo0TohH5 ki2vai6I ie7eiLoo eingai0R Jieque7s yeS0eChe OyahKoh3 eiy4OiVo yae5Aeng xogi8Uti ohfieGh6 roh1uXae saiw6aTh Phem2iuk theiN6ua Ieraen2i Aiz4tool Eex1oeCh gohTei8a lie3Esee Bupooc3t Xee9aing ieh1Ooh7 vai9Noth elu5ouT8 ir9aeGhi Zaew7oim mooqu2Er ze6Zoo7i thohf1Ee oshaeP4e aifue8Ch Aphe7ied No5Chein Faichah9 uoY3Zood Daing2sh Ohh7liG7 aiZ3eque nai9Sovu phah7Ush eve0keeX Hix9aiqu quei7Lee evi4ifoJ Toap2ohf agh7Aev0 Ope7phae ShahWi4e Thichie5 aNohf2de Oogoa5Oh jieR6cua Lucha1Ov hoh8Loo0 eiW1kae2 PaiY9aeR Cuku0she Eth3yooy Aiv7emix Iez5Iim7 taireX1u AhTh5yuL EiS4Hah8 eesie1Ge TaiGh6ae beuZi9ae utha7aiM iso7Pohc ameZee1d eud2deeS ooH3Nie8 sehei5Oo hoh2eXom daeR3quo Mo0aewaz chopeeB4 dee6OoTh heeSaiT5 aeQuiR8i ohl8eu7U yoh6Idie aoX7oa0y Thae3aeL UC0jo2Pu to9oFeer ieGei0aa OoPo8oki neGoub5I iej6ieDi aey9aeDu Lohn5aed Fie8euNg see0tooM Voo1oowe zie7eiNa heCaeh2U ait4VaiD Queis1ve Chese9ae Qui6OoXi Uo6moong nahShei2 Ienee9Ee Tahniuv2 Ue0aisee jugeP0ey quaer1Ow Foafei1i
Вы можете указать количество необходимых паролей с помощью опции -N и указать количество символов в пароле с помощью опции -n:
$ pwgen -N 3 -n 5 aeCo2 Le7oy uv6Oh
Существует также опция -s чтобы создавать более сложные пароли (их сложнее запомнить и подобрать):
$ pwgen -N 3 -n 5 -s fY60V y6FIU 9XEt4
Я не заметил разницу в использовании опции -s, но в инструкции написано, что без этой опции пароль легче подобрать.
Итог
Теперь вы знаете 3 способа генерации случайных паролей в терминале Linux. Если вы работаете за компьютером и вам нужно просто сгенерировать пароль, то удобнее использовать какой-нибудь графический инструмент. А показанные здесь способы можно использовать в скриптах.
Например, вы можете создать пользователя со случайным паролем, или поменять пароль пользователю и выслать его на почту. Для этого просто сохраните пароль в переменной, выполните необходимые действия используя эту переменную и очистите её. При этом, в истории команд, вы не найдёте сгенерированный пароль.
Другие статьи по работе в Linux терминале доступны здесь.
Рассмотрим, как можно сгенерировать случайный пароль в командной строке Linux. Будем использовать /dev/urandom и утилиты makepasswd, pwgen
creating random pass for a user in bash
It works fine and displays a random pass on the screen, user is created successfully, but the problem is that I can login with that password, means the generated password for the user, doesn’t work. This is just a basic script before I in-cooperate this in ‘do while loop’ for a program where I’ll be creating multiple users and their random passwords and would be redirecting to save them into a text file. however, before that I’m stuck here, can anyone please point out my mistakes. P.s, I just started bash a week ago, so sorry if my question sounds stupid to you. Thank you in advance 🙂
2 Answers 2
I believe you are looking for:
PSD=$(cat /dev/urandom | tr -dc A-Za-z0-9 | head -c8)
example $PSD
Note: it is never a good idea to pipe the password from stdout to stdin from a pedantic security standpoint. Additionally, by echo ‘ing the password twice, you will leave it on stdin as only one instance will be consumed by passwd (if it will take one at all).
Per the comment and request, here is a script that will implement adding a user with the random password setting password expiration to 14 days. Note: the password will expire every 14 days until reset. Also note the use of useradd to create the user and set the password:
#!/bin/bash [ $UID = 0 ] || < printf "\n error: insufficient permission.\n\n" printf " script must be run as root (uid/euid = 0), user: '%s' can't.\n\n" "$USER" exit 1 >printf "\n Enter user to add : " read uname printf " Enter first/last name: " read fname printf " Enter password age : " read page PSD=$(cat /dev/urandom | tr -dc A-Za-z0-9 | head -c8) cat passwd -x $page $uname || < printf "\n error: setting passwd age failed.\n\n" exit 1 >printf "\n Account successfully created for user: %s\n\n" "$uname" else printf "\n No account created -- you answered '%s'\n\n" "$ans" fi exit 0
$ sudo bash uadd.sh Enter user to add : jroger Enter first/last name: Jolly Q. Roger Enter password age : 14 creating account for: name: Jolly Q. Roger user: jroger tpwd: fzMUiCnr page: 14 useradd -c "Jolly Q. Roger" -m -p fzMUiCnr jroger passwd -x 14 jroger Create (yes/no): yes passwd: password expiry information changed. Account successfully created for user: jroger $ id jroger uid=2056(jroger) gid=100(users) groups=100(users)