有没有办法在Python中编写脚本来更改Linux中的用户密码?如果是这样,怎么样?

时间:2011-01-20 15:33:50

标签: python linux authentication

我正在尝试用Python编写一些脚本,偶然发现需要在Linux系统中更新给定用户的密码......

更新:目标是实现脚本从给定的数据/算法自动更新密码。重要的是没有人为干预......

有没有办法实现这一目标?或者我应该通过其他方式搜索?

谢谢!

4 个答案:

答案 0 :(得分: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

答案 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