-
Notifications
You must be signed in to change notification settings - Fork 17
/
createsetuser
49 lines (45 loc) · 1.76 KB
/
createsetuser
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/python2
"""Set user from baseimage-docker with creation of external user mirrored inside container.
Needs to be included inside docker container for external usage.
Original: https://github.com/phusion/baseimage-docker/blob/master/image/setuser
Additions:
- Create user inside container with a specific group mirroring external user
- Set local environmental variables specified in bash /etc/profile.
"""
import sys, os, pwd
import subprocess
if len(sys.argv) < 6:
sys.stderr.write("Usage: /sbin/createsetuser USERNAME UID GROUPNAME GID COMMAND [args..]\n")
sys.exit(1)
def abort(message):
sys.stderr.write("setuser: %s\n" % message)
sys.exit(1)
username, uid, groupname, gid = sys.argv[1:5]
subprocess.call(["addgroup", "--quiet", "--gid", gid, groupname])
homedir = os.path.join("/home", username)
homedir_args = ["-m", "-d", homedir] if not os.path.exists(homedir) else ["-M"]
subprocess.call(["useradd"] + homedir_args +
["-s", "/bin/bash", "-g", gid, "-o", "-u", uid, username])
try:
user = pwd.getpwnam(username)
except KeyError:
abort("user %s not found" % username)
os.initgroups(username, user.pw_gid)
os.setgid(user.pw_gid)
os.setuid(user.pw_uid)
os.environ['USER'] = username
os.environ['HOME'] = user.pw_dir
os.environ['UID'] = str(user.pw_uid)
# inherit environmental variables set in /etc/profile
inherit = set(["PATH", "LD_LIBRARY_PATH", "PERL5LIB"])
envs = subprocess.check_output(["bash", "-l", "-c", "env"])
os.chdir(user.pw_dir)
for line in envs.split("\n"):
if line.strip() and "=" in line:
key, val = line.split("=", 1)
if key in inherit:
os.environ[key] = val
try:
os.execvp(sys.argv[5], sys.argv[5:])
except OSError as e:
abort("cannot execute %s: %s" % (sys.argv[5], str(e)))