我正在尝试用Python编写一些脚本,并遇到了需要更新Linux系统中给定用户密码的需求...
更新:目标是通过给定的数据/算法自动更新密码。重要的是不需要人工干预...
有没有办法实现这个?还是我应该通过其他方式搜索?
谢谢!
我正在尝试用Python编写一些脚本,并遇到了需要更新Linux系统中给定用户密码的需求...
更新:目标是通过给定的数据/算法自动更新密码。重要的是不需要人工干预...
有没有办法实现这个?还是我应该通过其他方式搜索?
谢谢!
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
openssl passwd
(在命令行中传递明文密码)。#!/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上进行了测试。
今天我需要再次执行此操作,以下是我的解决方案。它完全自动化,并且还使用标准的系统passwd二进制文件,因此尊重系统策略。
#!/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')
subprocess
调用passwd
。--stdin
。 - Ignacio Vazquez-Abrams
usermod
的用户需要有修改/etc/passwd
和/etc/shadow
的权限。您需要检查一下passwd
如何在不需要权限的情况下更改密码。 - Juliusz Goneramkpasswd
能够生成更强的哈希值。我已经更新了答案。 - Juliusz Gonera