Example—Generating Random Passwords

mkpasswd is an example script that comes with Expect. mkpasswd generates a new password and optionally assigns it to a user by calling a password-setting program. This automates password creation and assignment while preventing any public exposure of the password.

In order to generate random passwords, mkpasswd uses a variation of the random number procedure above. rand generates a random integer from 0 to n-1.

proc rand {n} {
    global _ran

    set period 233280
    set _ran [expr ($_ran*9301 + 49297) % $period]
    expr int($n*($_ran/double($period)))
}

mkpasswd accepts arguments to control the length and how many digits and letters must be in a generated password. After parsing the arguments, minnum contains the minimum number of digits the password must have. minlower and minupper contain the minimum number of lower and uppercase characters. If the password must be longer than the sum of these variables, they are increased appropriately.

Once the arguments have been handled, the password generation code is simple. In the following fragment, the password is initially created with no characters. Each iteration of each for loop generates a random character of the right type and calls insertchar which adds the character to password.

# initialize password
set password ""

# add digits to the password
for {set i 0} {$i<$minnum} {incr i} {
    insertchar [rand 10]
}

# add lowercase letters
for {set i 0} {$i<$minlower} {incr i} {
    insertchar [format "%c" [expr 0x61 + [rand ...

Get Exploring Expect now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.