繁体   English   中英

从 Java 代码运行 Android shell 命令返回空输出

[英]Running Android shell command from Java code returns empty output

我正在尝试从我的 Java 代码运行 shell 命令( netstat -an -ptcat /proc/net/tcp )以检查 Android 设备上的开放 TCP 端口。 该设备是非root的(在root设备上,这没有问题)。

我发现有两种类型可以从 Java 代码调用 shell 命令。

要获取我尝试使用的流程对象:

  1. Runtime.getRuntime().exec(command);

  2. 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 上测试了相同的代码,一切都按预期工作。

我仍然没有弄清楚如何访问使用过的端口,但我将研究NetworkStatsManagerConnectivityManager类,如先前链接的文档中所述。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM