如何在Python脚本中为sudo命令自动输入密码
问题根因
你当前的写法无效是因为os.system()每调用一次都会创建独立的子shell进程:第一次执行sudo的进程处于等待密码输入的状态时,第二次os.system("myPassword")是在另一个全新的进程里执行,密码根本不会传递到sudo所在进程的标准输入流,所以完全不生效。
解决方案
方法1:sudo -S参数直接传递(最简实现)
sudo自带-S(即--stdin)参数,支持从标准输入读取密码,你可以直接通过管道把密码传给sudo,单命令即可完成操作:
import os # 把myPassword替换为你的实际密码 os.system('echo "myPassword" | sudo -S pmset schedule cancelall')
注意:该写法会把明文密码拼接在命令行中,存在被其他进程从进程列表中读取到密码的风险,仅适合个人自用的测试场景使用。
方法2:subprocess模块实现(更安全可控)
如果要避免密码出现在命令行参数中,可以用subprocess模块直接往sudo进程的标准输入写入密码,安全性更高:
import subprocess # 替换为你的实际密码 password = "myPassword" cmd = ["sudo", "-S", "pmset", "schedule", "cancelall"] # 启动进程并传入密码 proc = subprocess.Popen( cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) stdout, stderr = proc.communicate(input=password + "\n") # 可选:判断执行结果 if proc.returncode == 0: print("命令执行成功") else: print(f"执行失败,错误信息:{stderr}")
安全提示
无论使用哪种方法,都建议给你的setting_pm.py脚本设置严格的权限(仅当前用户可读可写),避免密码泄露。如果不想硬编码密码在脚本中,也可以将密码存储在 macOS 系统钥匙串中,执行时通过security命令读取密码再传入,进一步提升安全性。
内容的提问来源于stack exchange,提问作者display
相关产品推荐
相关产品推荐

