1、python 实现adb交互,进入adb shell后,如何再发送消息
os.popen("adb -s 192.168.1.100:5555 shell \"dmesg > /data/dmesg.log\"")
进入进入adb shell,在执行 dmesg > /data/dmesg.log
2、python(或BAT脚本)自动执行adb shell以后的命令
最近在用python做一个小工具,自动执行一些adb shell命令,使用subprocess.Popen来实现。
不过遇到个问题就是执行adb shell后就无法执行后面adb shell里的命令了,查询得知subprocess.Popen可以自定义stdin参数来源,比如可以使用上一个命令的stdout来做为下一个命令的stdin
p1 = subprocess.Popen('adb shell', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p2 = subprocess.Popen('ls', shell=True, stdin=p1.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print p2.stdout.read()
但在这里并未执行成功,怀疑原因是用subprocess执行adb shell,是在CMD环境下执行,而后面执行ls命令,就已经进入adb shell环境了
当然,我们可以直接在CMD中输入adb shell ls来达到目的,但一些adb shell自有命令如ll、grep在CMD中就无法识别
找到两个解决办法:
一、
把命令先保存在一个txt文档,如在D盘建一个a.txt,里面保存命令
cat /data/system/packages.xml | grep -E "a|b|c|d"
用输入重定向的方法在CMD输入:adb shell < a.txt
可以看到命令已经在CMD中执行了,但是会卡死,此时任何输入有效,但不显示,需要CTRL+C后才会显示出来
也可以将第2步做成BAT自动执行,建立一个run.bat,输入
adb shell < d:\a.txt
保存后直接执行run.bat就可以了
二、
上个方法虽然可行,但太过麻烦,而且需要第3方的文件来周转,之后在一个网友的帮助下,得到解决办法:
1.依然用python的subprocess.Popen实现
p1 = subprocess.Popen(‘adb shell cd sdcard&&cd Android&&cd data&&ls |grep com’, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print p1.stdout.read()
同时执行多行命令:
无论是 Linux/Mac 还是 Windows 的 shell 命令都支持一条命令来执行多条命令的。一共有&&,&,||,| 这么几种方式,这几种方式分别代表着不同的含义:
&&:command1 && command2,如果 command1 执行成功了,就执行命令 command2,如果 command1 失败了,就不会执行 command2 了。
&:command1 & command2,无论 command1 执行成功与否都会执行 command2。
||:command1 || command2,如果 command1 执行成功了,就不会执行 command2 了,如果 command1 失败了,就会继续执行 command2。
|:command1 | command2,command1 的结果做为 command2 的参数,如果 command1 失败了,整个命令也就都失败了。
Linux/Mac 下还可以使用;来链接两条命令,顺序执行命令,不管成功与否都往后执行,和&含义一样。
3、Python调用subprocess.Popen卡死的解决方案
在Python中,调用:subprocess.Popen(cmd, stdout = PIPE, stderr = PIPE, shell= true)的时候,如果调用的shell命令本身在执行之后会突然出现很多输出,则这个时候可能会导致hang在那里,表现就是卡死了,程序也不往下走,也不会报错。。。
原因就是: PIPE本身可容纳的量比较小,所以程序会卡死,所以一大堆内容输出过来的时候,会导致PIPE不足够处理这些内容,因此需要将输出内容定位到其他地方,例如临时文件等,
所以.需要将subprocess.Popen()的内容重定向到文件才可以,具体提到了这块的网址内容有下:
http://blog.youkuaiyun.com/losemyheaven/article/details/48159855
https://www.topjishu.com/4705.html
其中有一段是说要这样处理: ——————————————————————————————》
解决方法是不用subprocess提供的PIPE,而是使用自己创建的流。如此,可以控制流的大小。不多说,直接 上代码:
import subprocess
import traceback
import tempfile
try:
cmd = "ls -lh"
out_temp = tempfile.SpooledTemporaryFile(bufsize=10*1000)
fileno = out_temp.fileno()
obj = subprocess.Popen(cmd,stdout=fileno,stderr=fileno,shell=True)
obj.wait()
out_temp.seek(0)
lines = out_temp.readlines()
print lines
except Exception, e:
print traceback.format_exc()
finally:
if out_temp:
out_temp.close()