Baba Mok
Baba Mok

Reputation: 61

Write script to create multiple users with pre-defined passwords

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?

Upvotes: 4

Views: 16240

Answers (5)

linux.cnf
linux.cnf

Reputation: 797

Kindly run the below script.

#!/bin/bash
#purpose: bash script to create multiple users with pre-defined passwords at once.
#Read_Me: The import file should be in two columns, first users name and second passwords.
#author: Bablish Jaiswal
#contact: [email protected]

    read -p "Kindly import/type Users Name-password file with location:- " creation_info
    cat $creation_info |while read i p
    do
            ( useradd  $i   &&  echo -e "${p}\n${p}" |  passwd  $i )  > /dev/null 2>&1 && echo $user ${i} created and password is ${p} || echo ${i} failed 
    done

Upvotes: 0

user8176207
user8176207

Reputation:

Instead of using this line:

useradd -m -s /bin/false $iuser  

Try this one:

useradd -m -s /bin/false -p $ipasswd $iuser 

You don't actually need this:

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

Upvotes: 0

Manish Sakariya
Manish Sakariya

Reputation: 482

   #! /bin/bash

   for i in {1..100}
    do
      `sudo mkdir -p /root/Desktop/userm$i`
      `sudo useradd -m -d /root/Desktop/userm$i -s /bin/bash userm$i`
       echo "userm$i:userm$i" | chpasswd

   done

this will create 100 users.
user name will be (userm1-userm100).
home directory will be /root/Desktop/(userm1-user100)
password will be (userm1-userm100)

Upvotes: 0

mklement0
mklement0

Reputation: 437823

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.

Upvotes: 2

John1024
John1024

Reputation: 113844

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.)

Upvotes: 3

Related Questions