如何在Python中自动化带密码输入的ADB Shell操作?
解决ADB Shell自动化输入的问题
核心问题分析
你遇到的TypeError是因为subprocess.run的input参数在默认模式下需要字节对象,而非字符串。更关键的是,adb shell是交互式进程,密码和后续命令都要输入到这个进程的交互环境中,而非终端的外层命令。
解决方案
1. 修复类型错误(基础版)
如果只是解决字节/字符串的类型问题,可以将字符串编码为字节:
import subprocess password = "your_password" subprocess.run( 'cd /Users/michael/Documents/platform-tools/ ;./adb shell', shell=True, input=password.encode('utf-8') # 转成字节串 )
但这只能处理密码输入,无法执行后续命令,更推荐下面的完整方案。
2. 完整自动化交互方案
使用subprocess.Popen管理交互式进程,配合text=True模式直接处理字符串输入,同时一次性发送密码和后续命令:
import subprocess # 配置参数 ADB_PATH = "/Users/michael/Documents/platform-tools/adb" DEVICE_PASSWORD = "your_device_password" POST_PASSWORD_COMMANDS = [ "ls /sdcard", # 示例命令1:查看SD卡内容 "echo 'Automation done'" # 示例命令2:输出完成标记 ] # 拼接输入内容:密码 + 换行 + 每个命令加换行(模拟回车执行) input_content = f"{DEVICE_PASSWORD}\n" + "\n".join(POST_PASSWORD_COMMANDS) + "\n" # 启动adb shell交互式进程 adb_process = subprocess.Popen( [ADB_PATH, "shell"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True # 启用文本模式,无需手动编码解码 ) # 发送输入并获取执行结果 output, error = adb_process.communicate(input=input_content) # 查看结果 print("命令输出:\n", output) if error: print("错误信息:\n", error)
关键说明
- 直接使用adb的绝对路径,避免
cd命令的依赖,提升可靠性。 text=True(Python 3.7+支持)让进程的输入输出直接使用字符串,省去字节编码的麻烦。- 所有输入内容需要加上换行符
\n,模拟终端按回车执行命令的操作。 communicate()方法会一次性发送所有输入,并等待进程结束后返回输出和错误信息,适合一次性执行所有后续命令的场景。
内容的提问来源于stack exchange,提问作者Michi109
相关产品推荐
相关产品推荐

