Есть ли способ сценария в Python для изменения паролей пользователей в Linux? если да, то как? - PullRequest
5 голосов
/ 20 января 2011

Я пытаюсь написать несколько скриптов на Python и наткнулся на необходимость что-то сделать для обновления пароля данного пользователя в системе Linux ...

ОБНОВЛЕНИЕ: цель состоит в том, чтобы достичьскрипт для автоматического обновления пароля по заданным данным / алгоритму.Главное, чтобы не было вмешательства человека ...

есть ли способ достичь этого?или я должен искать с помощью других средств?

Спасибо!

Ответы [ 4 ]

8 голосов
/ 20 января 2011

Вы можете использовать openssl и usermod:

#!/usr/bin/env python
import subprocess

login = 'username'
password = 'somepassword'

# OpenSSL doesn't support stronger hash functions, mkpasswd is preferred
#p = subprocess.Popen(('openssl', 'passwd', '-1', password), stdout=subprocess.PIPE)
p = subprocess.Popen(('mkpasswd', '-m', 'sha-512', password), stdout=subprocess.PIPE)
shadow_password = p.communicate()[0].strip()

if p.returncode != 0:
    print 'Error creating hash for ' + login

r = subprocess.call(('usermod', '-p', shadow_password, login))

if r != 0:
    print 'Error changing password for ' + login
5 голосов
/ 10 февраля 2012

Вы можете использовать crypt для хеширования пароля вместо использования openssl passwd (где вы передаете пароль в виде открытого текста в командной строке)

Адаптация сценария Juliusz:

#!/usr/bin/env python
import subprocess,crypt,random

login = 'username'
password = 'somepassword'

ALPHABET = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
salt = ''.join(random.choice(ALPHABET) for i in range(8))

shadow_password = crypt.crypt(password,'$1$'+salt+'$')

r = subprocess.call(('usermod', '-p', shadow_password, login))

if r != 0:
    print 'Error changing password for ' + login

Таким образом, пароль передается только в уже хешированной командной строке (usermod).
Я проверял это с помощью Ubuntu + python2.6.6 + pycrypto2.5.

2 голосов
/ 24 апреля 2012

Мне просто нужно было сделать это снова сегодня, и ниже мое решение. Он полностью автоматический, а также использует стандартный двоичный файл системного пароля, поэтому соблюдаются системные политики.

#!/usr/bin/python3    

username = 'joe'

# generate passphrase
pw_length = 6
phrase = subprocess.check_output(['pwgen', str(pw_length), '1'])
phrase = phrase.decode('utf-8').strip()

dev_null = open('/dev/null', 'w')
passwd = subprocess.Popen(['sudo', 'passwd', user], stdin=subprocess.PIPE,
                          stdout=dev_null.fileno(),
                          stderr=subprocess.STDOUT)
passwd.communicate( ((phrase + '\n')*2).encode('utf-8') )
if passwd.returncode != 0:
    raise OSError('password setting failed')

(Это также сгенерировало пароль. Пропустите первую часть, если не полезно.)

0 голосов
/ 20 января 2011

Используйте subprocess для вызова passwd.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...