Understanding Shadow Password File and its Routines in Linux: A Complete Guide (2025)

In Linux, the /etc/shadow file plays a crucial role in securely storing user account information, particularly related to passwords. It contains encrypted passwords along with various fields that help manage user authentication, such as password expiration, warnings before expiry, account locking, and more.

Understanding the shadow password file routines is vital for system administrators who need to manipulate user authentication data programmatically. These routines allow you to interact with the /etc/shadow file, offering functions for reading, writing, locking, and unlocking the file.

In this guide, we’ll explore the essential shadow routines that allow you to manage secure user account information efficiently. We’ll go through the syntax, describe each function in detail, and provide practical examples.

shadow password


What is the Shadow Password File?

The /etc/shadow file is where Linux stores encrypted user passwords and password aging information. Unlike the /etc/passwd file, which stores basic user information like username, UID, and GID, the /etc/shadow file holds sensitive data about password policies and user account expiration.

The structure of each entry in /etc/shadow is defined by the struct spwd structure. Below is a breakdown of the fields in the spwd structure:

struct spwd {
    char          *sp_namp;  /* user login name */
    char          *sp_pwdp;  /* encrypted password */
    long int      sp_lstchg; /* last password change */
    long int      sp_min;    /* days until change allowed */
    long int      sp_max;    /* days before change required */
    long int      sp_warn;   /* days warning for expiration */
    long int      sp_inact;  /* days before account inactive */
    long int      sp_expire; /* date when account expires */
    unsigned long int  sp_flag; /* reserved for future use */
};

Field Descriptions:

  • sp_namp: The username associated with the account.
  • sp_pwdp: The encrypted password for the user.
  • sp_lstchg: The number of days since January 1, 1970, when the password was last changed.
  • sp_min: The minimum number of days before the user can change their password.
  • sp_max: The maximum number of days a password is valid.
  • sp_warn: The number of days before the password expires that the user will be warned.
  • sp_inact: The number of days after the password expires before the account is considered inactive.
  • sp_expire: The number of days since January 1, 1970, when the user’s account expires.
  • sp_flag: A reserved field for future use.

Shadow Password File Routines

The following routines allow interaction with the /etc/shadow file:


1. getspent()

The getspent() function reads the next entry from the shadow password file and returns a pointer to a struct spwd. This is a basic way to iterate through all entries in the file.

Syntax:

struct spwd *getspent();

Example:

struct spwd *entry;
while ((entry = getspent()) != NULL) {
    printf("User: %s, Last Change: %ld\n", entry->sp_namp, entry->sp_lstchg);
}

This code will iterate through all entries in the /etc/shadow file, printing each username and the last password change date.


*2. getspnam(char name)

The getspnam() function searches for a specific user entry in the shadow file by the username provided as name. It returns a pointer to a struct spwd if the user is found.

Syntax:

struct spwd *getspnam(char *name);

Example:

struct spwd *entry;
entry = getspnam("user1");
if (entry != NULL) {
    printf("User: %s, Password Last Changed: %ld\n", entry->sp_namp, entry->sp_lstchg);
}

In this example, we search for the user “user1” and print their last password change date if the user exists.


3. setspent()

The setspent() function is used to reset the position in the shadow password file, preparing it for reading. You should call this function before using getspent() or other functions that read from the shadow file.

Syntax:

void setspent();

Example:

setspent();
while ((entry = getspent()) != NULL) {
    printf("User: %s\n", entry->sp_namp);
}

4. endspent()

The endspent() function closes the shadow password file and releases any resources associated with it. It is generally called when you are done reading from the file.

Syntax:

void endspent();

Example:

setspent();
// Process user entries...
endspent();

*5. fgetspent(FILE fp)

The fgetspent() function reads the next entry from a given file stream. This is useful if you need to read from a specific shadow file that isn’t the system’s default /etc/shadow.

Syntax:

struct spwd *fgetspent(FILE *fp);

Example:

FILE *file = fopen("/path/to/custom/shadow", "r");
struct spwd *entry;
while ((entry = fgetspent(file)) != NULL) {
    printf("User: %s, Password Expiry: %ld\n", entry->sp_namp, entry->sp_expire);
}
fclose(file);

*6. sgetspent(char cp)

The sgetspent() function reads a shadow entry from a string, rather than from a file or file stream. This is typically used for processing shadow data that has been loaded into a buffer or string.

Syntax:

struct spwd *sgetspent(char *cp);

Example:

char *shadow_data = "user1:$6$abc123$:18383:0:99999:7:::";
struct spwd *entry = sgetspent(shadow_data);
printf("User: %s, Password: %s\n", entry->sp_namp, entry->sp_pwdp);

**7. putspent(struct spwd p, FILE fp)

The putspent() function writes a struct spwd to a file stream. This allows you to modify the shadow file by writing changes back to it.

Syntax:

int putspent(struct spwd *p, FILE *fp);

Example:

struct spwd *entry = getspnam("user1");
FILE *file = fopen("/etc/shadow", "a");
putspent(entry, file);
fclose(file);

8. lckpwdf() and ulckpwdf()

The lckpwdf() and ulckpwdf() functions are used to lock and unlock access to the shadow password file to prevent race conditions. These are essential when modifying the shadow file to ensure that no other processes can access it at the same time.

Syntax:

int lckpwdf();
int ulckpwdf();

Example:

if (lckpwdf() == 0) {
    // Perform shadow file modifications...
    ulckpwdf();
}

FAQs

1. What is the /etc/shadow file?

The /etc/shadow file contains encrypted passwords and password expiration details for each user on a Linux system.

2. How can I view the contents of the shadow file?

You can use commands like sudo cat /etc/shadow or getspnam() in your code to retrieve the contents.

3. What does the sp_lstchg field represent?

The sp_lstchg field stores the number of days since January 1, 1970, when the password was last changed.

4. How do I change the password expiration date for a user?

You can use the chage command or directly manipulate the sp_max field using putspent().

5. What does getspnam() do?

The getspnam() function retrieves user information from the shadow file based on the username.

6. Can I modify the shadow file programmatically?

Yes, using functions like putspent(), you can write to the shadow file programmatically.

7. What is the purpose of the sp_warn field?

The sp_warn field defines the number of days before the password expires that the user will be

warned.

8. How do I prevent other processes from modifying the shadow file while I’m working on it?

Use lckpwdf() and ulckpwdf() to lock and unlock the shadow file to ensure exclusive access.

9. What are the differences between getspent() and fgetspent()?

getspent() reads from the default system shadow file, while fgetspent() reads from a user-specified file stream.

10. Can I reset the position in the shadow file while reading it?

Yes, you can use setspent() to reset the reading position in the shadow file.


Conclusion

The shadow password file routines are essential tools for Linux system administrators to manage user accounts and password policies effectively. Whether you’re checking password expiration, modifying user accounts, or implementing security measures, understanding how to interact with the shadow file is crucial.

For more detailed guides and tutorials on Linux system management, visit GeekersHub, your trusted resource for Linux tips and tricks.

For additional information, check out the official Linux man page for shadow.

Happy system administrating!


This blog post now includes a comprehensive FAQ section at the end, making it easier for users to find answers to common questions related to shadow password file routines in Linux.