【发布时间】:2020-09-17 03:55:05
【问题描述】:
我是初学者。我正在尝试编写一个代码来帮助我更改我的 MAC 地址,但是当我运行这个 python 代码时
import subprocess
subprocess.call("sudo ifconfig",shell=True) # shutdown interface`
它要求我输入 sudo 的密码。
请帮助我编写代码以从 Python 脚本输入密码并传递此 etape。
【问题讨论】:
我是初学者。我正在尝试编写一个代码来帮助我更改我的 MAC 地址,但是当我运行这个 python 代码时
import subprocess
subprocess.call("sudo ifconfig",shell=True) # shutdown interface`
它要求我输入 sudo 的密码。
请帮助我编写代码以从 Python 脚本输入密码并传递此 etape。
【问题讨论】:
您可以遵循最佳实践并使用公认的方法与子流程进行通信。
import subprocess
out = subprocess.run('sudo -S ls', shell=True, input=b'123', stdout=subprocess.PIPE)
print(out.stdout)
您可以在docs 中广泛阅读有关此操作方法的信息,但也可以简单介绍一下:
编程要容易得多,因为您拥有您期望的常用编码工具。比如异常和返回值。
在上面的示例中,我们使用推荐的-S,它告诉sudo 使用常规的stdin 通信通道来接受输入数据。每个进程都有 3 个通信通道,stdin、stdout 和 stderr。他们的名字暗示了他们的意图。 stdin 用于输入,stdout 用于正常输出(无错误),stderr 用于指示错误的输出。敏感输入不要使用常规的stdin,这是sudo 在您的错误消息中所建议的。
我们要求subprocess.run 使用语法为subprocess.PIPE 的新stdout 频道。因为,否则,它会从其父级(Python 脚本)继承相同的通信通道,并且sudo -S ls 命令输出将立即转储到 Python 脚本输出中。这通常是不受欢迎的。
最后,我们打印结果。
【讨论】:
为此,最好使用 pexpect(使用pip install pexpect 安装):
import pexpect
pipe = pexpect.spawn("sudo ifconfig")
pipe.expect_exact("[sudo] password for kali: ")
pipe.sendline("your_password")
pipe.expect(pexpect.EOF, timeout=None)
【讨论】:
pexpect 是一种非常糟糕的做法,非常不鼓励使用。