如何使用子进程来回答shell提示?

问题描述 投票:0回答:1

我正在尝试创建一个基本的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个回答
2
投票

您可以使用 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
的使用,这对于非特权用户来说会失败)。
    

© www.soinside.com 2019 - 2024. All rights reserved.