我正在尝试用Python编写一些脚本,偶然发现需要在Linux系统中更新给定用户的密码......
更新:目标是实现脚本从给定的数据/算法自动更新密码。重要的是没有人为干预......
有没有办法实现这一目标?或者我应该通过其他方式搜索?
谢谢!
答案 0 :(得分:8)
您可以使用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
答案 1 :(得分: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进行了测试。
答案 2 :(得分:2)
我今天只需要再次这样做,下面是我的解决方案。它是全自动的,并且还使用标准系统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')
(这也生成了密码。如果没用,请跳过第一部分。)
答案 3 :(得分:0)
使用subprocess
来调用passwd
。