Python 如何使用子流程生成wser shell提示?

Python 如何使用子流程生成wser shell提示?,python,linux,python-3.x,terminal,subprocess,Python,Linux,Python 3.x,Terminal,Subprocess,我正在尝试创建一个基本的python脚本,使用子进程将用户密码更改为存储的变量。尽管我找不到任何地方解释如何让它与提示通信,但它只发送命令。下面是我要完成的基本任务大纲 import subprocess import os pass = root user = FakeUser subprocess.call(['sudo passwd', user], shell=True) 然后它要求输入新的unix密码: subprocess.call([pass], shell=True) 然后

我正在尝试创建一个基本的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)
希望这是有道理的。我只需要与终端通信的代码,而不仅仅是发送命令。

您可以使用该模块进行此操作
passwd
将在每一个交互行上打印出单词
password
(根据您的系统,它可能是大写的),因此我在这里使用的方法就是在发送下一行之前等待交互提示被打印出来
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权限的用户帐户上执行此操作,您仍然可以执行此操作,但您需要首先切换用户(并且可能会删除
sudo
,这对于无权限的用户将失败)。

您可以使用此模块执行此操作
passwd
将在每一个交互行上打印出单词
password
(根据您的系统,它可能是大写的),因此我在这里使用的方法就是在发送下一行之前等待交互提示被打印出来
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权限的用户帐户上执行此操作,您仍然可以执行此操作,但您需要首先切换用户(并且可能会删除
sudo
,这对于无权限的用户将失败)。

此代码是否运行?您需要打开stdin并以pty的形式关闭进程。这样地。或者使用像rnorris所示的pexpect,这段代码是否运行?您需要以pty的形式打开stdin和stout进程。这样地。或者像rnorris Showed那样使用pexpect您的链接不好。您的链接不好。