gpt4 book ai didi

python-3.x - 如何在 Python 中的终端密码提示中输入密码

转载 作者:行者123 更新时间:2023-12-04 01:45:44 31 4
gpt4 key购买 nike

我正在尝试制作一个简单的 Python 脚本,该脚本在使用“su”命令(或任何其他需要管理员权限或只需要密码才能执行的命令)后在命令行中输入给定密码。

我尝试为此使用 Subprocess 模块以及 pynput,但无法弄清楚。

import subprocess
import os

# os.system('su') # Tried using this too

process = subprocess.Popen('su', stdin=subprocess.PIPE, stdout=subprocess.PIPE)
process.stdin.write(b"password_to_enter")
print(process.communicate()[0])
process.stdin.close()

我期待在输入“su”命令后在给定的密码提示中输入“password_to_enter”,但事实并非如此。我也尝试给它正确的密码,但仍然没有用。

我究竟做错了什么?

PS:我在Mac上

最佳答案

su命令期望从终端读取。在我的 Linux 机器上运行上面的示例会返回以下错误:

su: must be run from a terminal

这是因为 su试图确保它是从终端运行的。您可以通过分配 pty 来绕过它。并自己管理输入和输出,但要做到这一点可能非常棘手,因为在 su 提示输入密码之前您无法输入密码。例如:
import subprocess
import os
import pty
import time

# Allocate the pty to talk to su with.
master, slave = pty.openpty()

# Open the process, pass in the slave pty as stdin.
process = subprocess.Popen('su', stdin=slave, stdout=subprocess.PIPE, shell=True)

# Make sure we wait for the "Password:" prompt.
# The correct way to do this is to read from stdout and wait until the message is printed.
time.sleep(2)

# Open a write handle to the master end of the pty to write to.
pin = os.fdopen(master, "w")
pin.write("password_to_enter\n")
pin.flush()

# Clean up
print(process.communicate()[0])
pin.close()
os.close(slave)

有一个名为 pexpect 的库这使得与交互式应用程序的交互变得非常简单:
import pexpect
import sys

child = pexpect.spawn("su")
child.logfile_read = sys.stdout
child.expect("Password:")
child.sendline("your-password-here")
child.expect("#")
child.sendline("whoami")
child.expect("#")

关于python-3.x - 如何在 Python 中的终端密码提示中输入密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55334273/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com