19

How do I create a user in Linux using Python? I mean, I know about the subprocess module and thought about calling 'adduser' and passing all the parameters at once, but the 'adduser' command asks some questions like password, full name, phone and stuff. How would I answer this questions using subprocess? I've seen module called pexpect in this question: Can I use Python as a Bash replacement?. Is there any other standard module?

6 Answers 6

24

Use useradd, it doesn't ask any questions but accepts many command line options.

Sign up to request clarification or add additional context in comments.

1 Comment

how about using libuser python binding to perform this operation?
7

On Ubuntu, you could use the python-libuser package

3 Comments

Is this a ubuntu-only package? If I need to run it on other distros, will I have to manually install this package?
You are probably better off with useradd for cross-distribution compatibility, but note that even useradd is not guaranteed to be available on all distros. Puppy Linux I believe does not come with useradd by default, for example.
python-libuser link is dead => packages.ubuntu.com/source/xenial/libuser
5
import os
import crypt

password ="p@ssw0rd" 
encPass = crypt.crypt(password,"22")
os.system("useradd -p "+encPass+" johnsmith")

4 Comments

what's the number 22 for? Is this still the proper way to encrypt in 2017?
22 is a salt. You can use random values. If you want to extra security you can use sha-256 or sha-512
It has to be "22". The command useradd expects a specific hash.
Does it require a sudo permission? @Jonathan Rioux
3

You could just use the built-in binaries so just call useradd or something through the subprocess module, However I don't know if there's any other modules that hook into Linux to provide such functionality.

Comments

2
def createUser(name,username,password):
    encPass = crypt.crypt(password,"22")   
    return  os.system("useradd -p "+encPass+ " -s "+ "/bin/bash "+ "-d "+ "/home/" + username+ " -m "+ " -c \""+ name+"\" " + username)

3 Comments

What's the number 22 for? Also, would subprocess be better than os.system?
@answerSeeker it is salt. salt is a 2-character string which will be used to select one of 4096 variations of DES. (from pydoc)
sorry for the necrobump, but crypt can generate a salt for you, no need to specify. salt = crypt.mksalt(crypt.METHOD_SHA512) salthash = crypt.crypt(password, salt) see here for more info.
1

This is a solution where shell is false.

#!/bin/env/python

import subprocess
import traceback
import sys


def user_add(username, user_dir=None):
    if user_dir:
        cmd = ["sudo", "useradd", "-d", user_dir, "-m", username]
    else:
        cmd = ["sudo", "useradd", username]

    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    output, error = p.communicate()
    output = output.strip().decode("utf-8")
    error = error.decode("utf-8")
    if p.returncode != 0:
        print(f"E: {error}")
        raise
    return output


try:
    username = "user"
    output = user_add(username)
    print(F"Success. {username} is added")
except:
    traceback.print_exc()
    sys.exit(1)


Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.