Skip to content

Instantly share code, notes, and snippets.

@inesusvet
Created September 30, 2016 16:59
Show Gist options
  • Save inesusvet/3e9484dcbbaa183f412ab8900f8dbcd5 to your computer and use it in GitHub Desktop.
Save inesusvet/3e9484dcbbaa183f412ab8900f8dbcd5 to your computer and use it in GitHub Desktop.
Создание linux-пользователя по шаблону
# ~*~ coding: utf-8 ~*~
import datetime
import os
import sys
import subprocess
"""
Документация по модулю subprocess, который позволяет вызывать другие процессы,
писать им в stdin, читать из stdout и stderr, проверять код их завершения
https://docs.python.org/2/library/subprocess.html
Здесь используются только вызовы
- subprocess.check_call()
- subprocess.Popen()
"""
BASE_DIR = '/opt/home'
DEFAULT_SHELL = '/usr/bin/zsh'
DEFAULT_GID = 'users'
TEMP_PASSWORD_PREFIX = 'qwerty'
def user_exists(username):
try:
subprocess.check_call(['id', username])
# Полагаю что пользователь существует если вызов не вернул ошибки
return True
except subprocess.CalledProcessError:
# Ошибка возникает если код завершения ненулевой -- пользователя нет
return False
def add_user(username, home_dir, shell, gid, groups):
yesterday = datetime.date.today() - datetime.timedelta(days=1)
# Собираем строку для выполнения
cmd = [
'useradd', username,
'-m', '-d', home_dir,
'--gid', gid,
'--shell', shell,
'--expiredate', yesterday.isoformat(), # Пароль устарел вчера
]
if groups:
cmd += ['--groups'] + list(groups)
# Вызываем команду создания пользователя с параметрами
subprocess.check_call(cmd)
def set_user_password(username, password):
pipe = subprocess.Popen('chpasswd', stdin=subprocess.PIPE) # Запускаем дочерний процесс с возможностью записи в stdin
pipe.stdin.write('%s:%s' % (username, password)) # Пишем ему в stdin
pipe.communicate() # Ждем выполнения дочернего процесса
def main():
"""
Ожидается вызов в формате
# python user-admin.py username group1 group2 groupN
"""
# Проверяем кол-во параметров командной строки
if len(sys.argv) < 1:
print 'One argument is required'
return
# Получаем имя пользователя из командной строки
username = sys.argv[0]
# Если пользователь уже существует, выходим
if user_exists(username):
print 'User %s exists already' % username
return
home = os.path.join(BASE_DIR, username)
groups = sys.argv[1:]
# Создаем пользователя
add_user(username, home, DEFAULT_SHELL, DEFAULT_GID, groups)
# Устанавливаем временный пароль по шаблону
temp_password = TEMP_PASSWORD_PREFIX + username
set_user_password(username, temp_password)
# Выполнять все действия только если запущено как скрипт
if __name__ == '__main__':
try:
main()
except subprocess.CalledProcessError as exception:
print 'ERROR: %s" % exception
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment