[英]Running Android shell command from Java code returns empty output
我正在尝试从我的 Java 代码运行 shell 命令( netstat -an -pt
, cat /proc/net/tcp
)以检查 Android 设备上的开放 TCP 端口。 该设备是非root的(在root设备上,这没有问题)。
我发现有两种类型可以从 Java 代码调用 shell 命令。
要获取我尝试使用的流程对象:
Runtime.getRuntime().exec(command);
new ProcessBuilder().command("sh", "-c", command).start();
稍后,我正在获取进程 InputStream 对象并输出结果。
问题是cat /proc/net/tcp
命令的结果是空字符串, netstat -an -pt
结果是:
Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State Active UNIX domain sockets (w/o servers) Proto RefCnt Flags Type State I-Node Path
...这是netstat
命令的标题。
当直接在 Android shell 中运行上面的命令时(通过在非 root 设备中打开adb shell
)一切正常,命令的输出显示在控制台中。
我怀疑权限存在一些问题,因为这适用于有根设备。
运行以下命令之一时的 Logcat 输出:
W cat : type=1400 audit(0.0:3***4): avc: denied { read } for name="tcp" dev="proc" ino=4*2653***6 scontext=u:r:untrusted_app:s*:c**9,c**7,c5**,c*6* tcontext=u:object_r:proc_net_tcp_udp:s0 tclass=file permissive=0
如果这是一个权限问题,是否有另一种方法可以使用我的应用程序读取非根 Android 设备上当前打开的 TCP 端口?
我部分找到了足够的答案。 基本上问题在于首先怀疑的权限。
如文档中所述:从 Android 版本 10 /proc/net
文件系统受到限制且无法访问。 不幸(或者我应该说幸运)是我的非 root 测试设备是 Android 10,因此进程对象将返回状态 1,因为它没有读取/proc/net
文件系统的权限。
我在 Android 8 上测试了相同的代码,一切都按预期工作。
我仍然没有弄清楚如何访问使用过的端口,但我将研究NetworkStatsManager和ConnectivityManager类,如先前链接的文档中所述。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.