While traditional UNIX systems enforced an 8-character username limit (defined in
UT_NAMESIZE
), modern GNU/Linux distributions have significantly extended this constraint. The actual limitation now depends on multiple factors:
- POSIX Compliance: Requires at least 8 characters (but implementations may exceed this)
- Shadow Password Suite: The
useradd
tool typically allows up to 32 characters - Filesystem Limitations: EXT4 supports 255-byte filenames (UTF-8 encoded usernames require consideration)
To verify your system's actual limits, examine these critical files and commands:
# Check login.defs configuration
grep "^NAME_MAX" /etc/login.defs
# Query PAM configuration
grep "maxlen" /etc/security/pam_unix.so
# Systemd-specific check
systemctl show --property=NameMaxLength
When programmatically handling usernames, consider these defensive programming approaches:
# Python example with getpwnam()
import pwd
try:
user = pwd.getpwnam("very_long_username_1234567890")
print(f"Username valid, UID: {user.pw_uid}")
except KeyError:
print("Username not found or too long")
# C example checking LOGIN_NAME_MAX
#include <limits.h>
#include <stdio.h>
int main() {
printf("Maximum username length: %d\n", LOGIN_NAME_MAX);
return 0;
}
Long usernames affect various system paths:
/home/very_long_username_1234567890
/var/mail/very_long_username_1234567890
/var/spool/cron/crontabs/very_long_username_1234567890
Test path length handling with:
# Create test user with maximum length
sudo useradd -m "$(printf '%*s' 255 ' ' | tr ' ' 'a')"
Various services impose their own limitations:
Service | Default Limit |
---|---|
PostgreSQL | 63 bytes |
MySQL | 32 characters |
Samba | 20 characters |
Historically, Unix systems enforced an 8-character limit for usernames due to legacy compatibility with early Unix implementations. However, modern GNU/Linux distributions have significantly expanded this limit while maintaining backward compatibility.
The actual maximum username length is defined by:
#include <limits.h>
#define LOGIN_NAME_MAX 256 /* From glibc headers */
Key implementation details:
- Linux kernel: 64 characters (UTS_NAMESIZE in kernel headers)
- Glibc: 256 characters (LOGIN_NAME_MAX)
- Shadow suite (useradd): 32 characters by default
Most modern distributions override the default limits:
# Ubuntu/Debian (/etc/login.defs)
MAX_USERNAME_LENGTH 32
# RHEL/CentOS (/etc/login.defs)
UID_MAX 60000
To check your system's actual limit:
getconf LOGIN_NAME_MAX # Shows the system-wide limit
useradd -D | grep NAME # Shows user creation defaults
Example of creating a long username (Ubuntu):
sudo useradd -m "this_is_a_very_long_username_example"
id this_is_a_very_long_username_example
Watch for these potential issues:
- Legacy applications using fixed-size buffers
- NFS mounts with older servers
- Authentication systems like Kerberos (often limited to 20 chars)
For production systems:
# Enforce reasonable limits in /etc/login.defs
MAX_USERNAME_LENGTH 20
When writing applications, always use dynamic allocation:
char *username = malloc(LOGIN_NAME_MAX);
getlogin_r(username, LOGIN_NAME_MAX);