有没有方法用Python脚本更改Linux用户密码?如果有,怎么做?

6 投票
4 回答
11085 浏览
提问于 2025-04-16 10:19

我正在尝试用Python写一些脚本,结果发现需要做一个东西来更新Linux系统中某个用户的密码...

更新:我的目标是让这个脚本能够自动更新密码,使用给定的数据或算法。最重要的是不需要人工干预...

有没有办法做到这一点?还是我应该寻找其他方法?

谢谢!

4 个回答

2

我今天又需要做这个,下面是我的解决方案。这个方法完全自动化,并且使用了系统自带的密码工具,所以遵循了系统的安全政策。

#!/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')

(这个方法也生成了密码。如果你觉得前面的部分没用,可以跳过。)

5

你可以使用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上测试过这个方法。

8

你可以使用 opensslusermod 呢:

#!/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

撰写回答