2

我正在尝试shell在我的 Android 应用程序中运行一个命令,以检查是否tcp port打开了一个命令:

Runtime.getRuntime().exec(arrayOf("/system/bin/sh", "-c", "netstat -tulpn | grep :8080"))

在 Android 版本 < 10 中运行此命令可以正常工作。如果使用了给定的端口,它将进行完整扫描并返回条目。

但在 Android 10 中,它不再工作了。进程 exec 将返回:

Process[pid=9534 ,hasExited=true, exitcode=1]

当读取inputStream进程时它总是null,而netstat -tulpn | grep :8080从终端执行时将返回一个条目,如预期的那样。

跑步

Runtime.getRuntime().exec(arrayOf("/system/bin/sh", "-c", "netstat -tulpn"))

单独,并解析输出,只会显示:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program Name

并且根本没有其他数据。

我只在 Android 10 中遇到这个问题,因为对于旧版本它可以工作。

Android 10 关于 shell 命令有什么变化吗?我有必要运行这个命令。任何帮助,将不胜感激...

4

2 回答 2

2

这很可能是因为 Android 10 中改进了隐私保护。

看这里:https ://developer.android.com/about/versions/10/privacy/changes#proc-net-filesystem

于 2020-07-27T19:26:36.747 回答
0

我的目标是检查给定的 tcpport是否正在使用中。我做了这个方法来完成我正在寻找的工作:

private fun isPortUsed(port: Int): Boolean {
    return try {
      // Try to open socket at the given port
      val socket = ServerSocket(port)
      // Release port
      socket.close()
      false
    } catch (ex: BindException) {
        // Port is already in use
        true
    } catch (ex: Exception) {
        // Other reason for failing
        false
    }
}
于 2020-07-27T20:41:40.293 回答