Created
September 30, 2016 16:59
-
-
Save inesusvet/3e9484dcbbaa183f412ab8900f8dbcd5 to your computer and use it in GitHub Desktop.
Создание linux-пользователя по шаблону
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# ~*~ 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