【问题标题】:using Python to change MAC address使用 Python 更改 MAC 地址
【发布时间】:2020-09-17 03:55:05
【问题描述】:

我是初学者。我正在尝试编写一个代码来帮助我更改我的 MAC 地址,但是当我运行这个 python 代码时

import subprocess
subprocess.call("sudo ifconfig",shell=True) # shutdown interface`

它要求我输入 sudo 的密码。

请帮助我编写代码以从 Python 脚本输入密码并传递此 etape。

【问题讨论】:

    标签: python linux


    【解决方案1】:

    您可以遵循最佳实践并使用公认的方法与子流程进行通信。

    import subprocess
    
    
    out = subprocess.run('sudo -S ls', shell=True, input=b'123', stdout=subprocess.PIPE)
    print(out.stdout)
    

    您可以在docs 中广泛阅读有关此操作方法的信息,但也可以简单介绍一下:
    编程要容易得多,因为您拥有您期望的常用编码工具。比如异常和返回值。

    在上面的示例中,我们使用推荐的-S,它告诉sudo 使用常规的stdin 通信通道来接受输入数据。每个进程都有 3 个通信通道,stdinstdoutstderr。他们的名字暗示了他们的意图。 stdin 用于输入,stdout 用于正常输出(无错误),stderr 用于指示错误的输出。敏感输入不要使用常规的stdin,这是sudo 在您的错误消息中所建议的。

    我们要求subprocess.run 使用语法为subprocess.PIPE 的新stdout 频道。因为,否则,它会从其父级(Python 脚本)继承相同的通信通道,并且sudo -S ls 命令输出将立即转储到 Python 脚本输出中。这通常是不受欢迎的。

    最后,我们打印结果。

    【讨论】:

      【解决方案2】:

      为此,最好使用 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 是一种非常糟糕的做法,非常不鼓励使用。
      • 是的,现在我意识到,硬编码密码并不是一个好主意。
      • @OngYongXin 你说的也对。但是,特别是使用 pexpect 可以很容易地创建“隐藏”的错误。您正在使用许多特定字符串极大地扩展您的函数和 pexpect 之间的语言词典。而不是使用更集中的进程间通信。一种类似的反模式工作方法是捕获异常并解析字符串以评估错误。而不是使用 Exception 子类类型来确定发生了什么。在更多的管理方面,它增加了开发成本。
      • @edd,当然假设 OP 在生产代码中使用它,那么是的。
      猜你喜欢
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 2018-01-18
      相关资源
      最近更新 更多