Write script to create multiple users with pre-defined passwords

14,947

Solution 1

You have to supply the password on stdin. Replace:

passwd $iuser

with:

passwd "$iuser" <<<"$ipasswd
$ipasswd"

or, as suggested by mklement0:

passwd "$iuser" <<<"$ipasswd"$'\n'"$ipasswd"

The incantation <<< creates a here-string. The string that follows the <<< is provided as standard in to the command which precedes the <<<. In this case we provide the two copies of the password that the passwd command wants.

(The script reads these passwords from a plain text file. I will assume that your situation is some special case for which this is not as dangerous as it normally would be.)

Solution 2

John1024's answer is the correct one - his warning about reading passwords from plain-text files bears repeating.

Let me show the solution in context, without the file-descriptor acrobatics (exec 3<, ...):

#!/bin/bash

# NOTE: Be sure to run this script with `sudo`.

# Read user and password
while read iuser ipasswd; do

  # Just print this for debugging.
  printf "\tCreating user: %s with password: %s\n" $iuser $ipasswd

  # Create the user with adduser (you can add whichever option you like).
  useradd -m -s /bin/false $iuser

  # Assign the password to the user.
  # Password is passed via stdin, *twice* (for confirmation).
  passwd $iuser <<< "$ipasswd"$'\n'"$ipasswd"

done < <(paste users.txt passwords.txt)
  • paste users.txt passwords.txt reads corresponding lines from the two files and puts them on a single line, separated with \t.
  • The result is piped to stdin via a process substitution (<(...)).
  • This allows read to read from a single source.
  • $\n is an ANSI C-quoted string that produces a (literal) newline.
Share:
14,947
Baba Mok
Author by

Baba Mok

Updated on August 21, 2022

Comments

  • Baba Mok
    Baba Mok over 1 year

    So I would like to make a script that create users from users.txt running

    useradd -m -s /bin/false users_in_the_users.txt
    

    and fill the password from passwords.txt twice (to confirm the passwords)

    This is the script

    #!/bin/bash
    
    # Assign file descriptors to users and passwords files
    exec 3< users.txt
    exec 4< passwords.txt
    exec 5< passwords.txt
    
    # Read user and password
    while read iuser <&3 && read ipasswd <&4 ; do
      # Just print this for debugging
      printf "\tCreating user: %s with password: %s\n" $iuser $ipasswd
      # Create the user with adduser (you can add whichever option you like)
      useradd -m -s /bin/false $iuser
      # Assign the password to the user, passwd must read it from stdin
      passwd $iuser
    done
    

    The problem is, it does not fill the passwords. And 1 more thing, I want the script to fill the passwords twice.

    Any suggestions?