Generating random strings is a common task for programmers and admins working in Bash. Random strings have many uses – they can be used as passwords, tokens, keys, IDs, and more.
In this comprehensive guide, we will explore 5 methods to generate random strings in Bash:
- Using md5sum
- Using the UUID generator
- Reading from /dev/urandom
- Base64 encoding random data
- Using OpenSSL
We will look at the advantages and disadvantages of each method, along with detailed examples and explanations.
Why Generate Random Strings?
Here are some common use cases where random strings come in handy:
- Generating hard-to-guess passwords for applications and users
- Creating unique IDs for database records
- Adding entropy for encryption keys
- Implementing security tokens for sessions and verification
- Adding variability to data sets when testing software
- Creating sample or dummy data for documentation
By generating random strings on the fly rather than hard-coding them, we make these types of features more secure and resilient.
Now let‘s look at 5 great ways to do this in Bash scripts.
1. Use md5sum
Our first method for generating random strings takes advantage of the built-in $RANDOM Bash variable and md5sum command:
echo $RANDOM | md5sum | head -c 20; echo
When you run this, $RANDOM prints a new random integer each time. We pipe this into md5sum, which generates a 32-character checksum based on the input. Taking only the first 20 chars with head gives us a nicely randomized string.
Let‘s break this down step-by-step:
- $RANDOM – Built-in bash pseudorandom integer generator
- md5sum – Calculate MD5 cryptographic checksums
- head -c 20 – Get first 20 characters of input
Here are some sample output strings:
6821b317ccecd59d6131
1a8538f1b0c0f31d4196
The main advantages of this method are:
- Uses only Bash built-ins, no external tools needed
- Reasonably fast and efficient
The main limitation is:
- Not a true CSPRNG cryptographically-secure pseudo-random generator
So in security-sensitive contexts relying solely on $RANDOM is not ideal, but for most general purposes it works well.
Overall this is a simple, straightforward way to get random strings in Bash.
2. Use the UUID Generator
Most Linux distributions come with a kernel-based UUID (universally unique identifier) generator located at /proc/sys/kernel/random/uuid. It generates 36-character UUIDs that contain 32 hexadecimal characters and 4 hyphens.
To turn these into random strings, we can remove the hyphens and extract just the hex chars:
cat /proc/sys/kernel/random/uuid | sed ‘s/[-]//g‘ | head -c 20; echo
This outputs 20-character strings like:
3aac7acc64dbe284ca6
58a07bef12f3ab9afe8
Going step-by-step:
- cat /proc/sys/kernel/random/uuid – Get UUID
- sed ‘s/[-]//g‘ – Remove hyphen characters
- head -c 20- Print first 20 characters
The main advantages of using kernel UUIDs are:
- Uses kernel CSPRNG random number generator, so more secure
- Each string is unique
The disadvantage is:
- Slower than some other methods
So while the UUID approach requires a bit more work to parse, it provides an excellent source of entropy from the kernel.
3. Read From /dev/urandom
The /dev/urandom special file is another kernel-based pseudo-random number generator, exposed as a device file readable by all users.
We can get random strings by piping /dev/urandom into tools like tr to define the desired character set, fold to set string lengths, and head to emit the desired number of results.
For example, here is code to get 5 random 20-character alphanumeric strings:
cat /dev/urandom | tr -dc ‘[:alnum:]‘ | fold -w 20 | head -n 5
Running this could output:
7JZFhgrfgQJAS4FwSqsP
i16rIzbrLp5YgoM44GQg
cpO37dkbq0QCfsAJfXf1
wtrBuiytSk14KqqO28LB
nBxDojZ89aFYWG13sxGZ
Let‘s examine each component:
- cat /dev/urandom – Random input bytes
- tr -dc ‘[:alnum:]‘ – Filter for alphanumeric chars
- fold -w 20 – Wrap lines to 20 chars
- head -n 5 – Output first 5 lines
We can tweak the character set in tr and lengths in fold to customize string formats.
The advantages of /dev/urandom are:
- Very fast, efficient way to get random data
- Kernel CSPRNG, more secure than $RANDOM alone
The main limitation is:
- Character set limited compared to other tools
Overall, /dev/urandom provides a solid foundation for generating random strings of varying lengths and formats.
4. Base64 Encode Random Data
The previous methods use tools to transform binary random data into other encodings. Another approach is to use base64 to encode arbitrary data into printable ASCII characters.
For example:
echo $RANDOM | base64 | head -c 20; echo
This takes the $RANDOM integer and encodes it with base64 before extracting a 20-char string.
Sample output:
mtAwoKC2jtGXIQ==
MkKCorLEozI3ka
Base64 creates a uniform distribution of characters, avoiding issues with things like ‘/‘ not being usable in URLs.
Some advantages of base64 encoding are:
- Very simple to implement
- Output string is URL-safe
Limitations include:
- Not the most efficient use of space
- Base64 can be targeted by attackers
So while not the most robust approach on its own, base64 encoding can be combined with other techniques to craft random strings suited for particular use cases.
5. Use OpenSSL
OpenSSL provides versatile pseudo-random number generation capabilities through its rand command.
For instance, to get a 20-byte hex string:
openssl rand -hex 20
Sample output:
1afd6c500cd92b6bac69d8472acc2cc3db8
Or get a base64-encoded string:
openssl rand -base64 20
Which could output:
fRLJMjTDFqQWCjEmJ7562g==
Advantages of the OpenSSL approach:
- Very versatile – output different encodings
- Secure algorithm and good entropy seeding
- Industry standard with vetted implementations
Downsides are:
- Requires installing OpenSSL package
- More complex to use vs built-in Bash features
So while a bit heavier in setup, OpenSSL provides state-of-the-art random string generation that can be tailored in many ways.
Conclusion
Generating random strings is a surprisingly common task for Bash scripters and programmers. Luckily, Bash and Linux offer many great options to accomplish this through hash functions, device random number generators, encoding schemes and libraries like OpenSSL.
To recap, here are quick pros and cons of the 5 best methods covered:
- md5sum – Simple and efficient, but not cryptographically secure
- UUID – More secure and gives unique values, but slower to generate
- /dev/urandom – Very fast and versatile, with decent randomness
- base64 – Easy to implement but predictable encoding scheme
- OpenSSL – Robust and advanced capabilities, but needs setup
The "best" approach depends on the context and security needs of your application, such as whether uniqueness is required or encoding formats preferred.
By leveraging the techniques described in this guide, you now have an arsenal of approaches to reliably generate random strings of different lengths, encodings and uniqueness constraints right from the Bash command line or scripts.


