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
Use useradd, it doesn't ask any questions but accepts many command line options.
1 Comment
S.K. Venkat
how about using
libuser python binding to perform this operation?On Ubuntu, you could use the python-libuser package
3 Comments
Salsa
Is this a ubuntu-only package? If I need to run it on other distros, will I have to manually install this package?
unutbu
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.alper
python-libuser link is dead => packages.ubuntu.com/source/xenial/libuserimport os
import crypt
password ="p@ssw0rd"
encPass = crypt.crypt(password,"22")
os.system("useradd -p "+encPass+" johnsmith")
4 Comments
answerSeeker
what's the number 22 for? Is this still the proper way to encrypt in 2017?
mcolak
22 is a salt. You can use random values. If you want to extra security you can use sha-256 or sha-512
lrsppp
It has to be "22". The command
useradd expects a specific hash.alper
Does it require a
sudo permission? @Jonathan Riouxdef 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
answerSeeker
What's the number 22 for? Also, would subprocess be better than os.system?
yanpas
@answerSeeker it is salt. salt is a 2-character string which will be used to select one of 4096 variations of DES. (from pydoc)
brent saner
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.
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)