我正在尝试创建一个基本的Python脚本来使用子进程将用户密码更改为存储的变量,但是我找不到任何地方可以解释如何让它与提示进行通信,它只发送命令。这是我想要实现的目标的基本轮廓
import subprocess
import os
pass = root
user = FakeUser
subprocess.call(['sudo passwd', user], shell=True)
然后它会要求输入新的 UNIX 密码:
subprocess.call([pass], shell=True)
然后又问:
subprocess.call([pass], shell=True)
希望这是有道理的。我只需要代码与终端通信,而不仅仅是发送命令。
您可以使用 pexpect 模块来实现此目的。
passwd
将在每个交互行上打印出单词password
(它可能是大写的,具体取决于您的系统),因此我在这里使用的方法只是等待打印交互提示,然后再发送下一行。 pexpect
通常会要求输入一次旧密码,然后输入两次新密码。这样的东西应该有效:
passwd
更新:由于您使用的是
import pexpect
def change_password(username, sudo_password, new_password):
process = pexpect.spawn("sudo passwd " + username)
process.expect("password")
process.sendline(sudo_password)
process.expect("password")
process.sendline(new_password)
process.expect("password")
process.sendline(new_password)
process.close()
username = "FakeUser"
sudo_password = "sudopass"
new_password = "new"
change_password(username, sudo_password, new_password)
,实际上会首先要求您输入 sudo 密码,然后您将被允许为任意用户设置密码,而无需知道他们的原始密码。我重新标记了变量以反映这一点。如果您想从没有 sudo 权限的用户帐户执行此操作,您仍然可以执行此操作,但您需要先切换用户(并且可能删除
sudo
的使用,这对于非特权用户来说会失败)。