【问题标题】:How to use subprocess to anwser shell prompts?如何使用子进程来回答 shell 提示?
【发布时间】:2019-03-02 19:54:59
【问题描述】:

我正在尝试创建一个基本的 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)

希望这是有道理的。我只需要代码与终端通信,而不仅仅是发送命令。

【问题讨论】:

标签: python linux python-3.x terminal subprocess


【解决方案1】:

您可以为此使用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 权限的用户帐户执行此操作,您仍然可以执行此操作,但您需要先切换用户(并且可能会删除sudo 的使用,这对于非特权用户会失败)。

【讨论】:

  • 您的链接不正确。
猜你喜欢
  • 2019-10-28
  • 1970-01-01
  • 2018-05-12
  • 1970-01-01
  • 2012-05-15
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多