【问题标题】:Execute Root Commands and read output Xamarin执行根命令并读取输出 Xamarin
【发布时间】:2018-11-28 18:28:45
【问题描述】:

我无法从根目录读取文件。 怎么做? 我使用命令阅读

Java.Lang.Process suProcess =  Java.Lang.Runtime.GetRuntime().Exec(new string[] { "su", "-c", "cat /data/misc/vpn/state" });

但是我如何得到答案呢?

【问题讨论】:

    标签: xamarin command root execute su


    【解决方案1】:

    Java.Lang.Process 类有一些有趣的Streams,您需要从中阅读。 InputStreamErrorStream

    首先,创建流程后,您需要等待它。这可以通过.WaitForAsync() 很好地完成。这将允许您回答通常在请求 root 权限时出现的任何对话框等。

    .WaitForAsync() 返回时,它会给你一个退出代码。 0 表示一切顺利,任何其他退出代码都表示可能有错误。

    在退出代码 0 的情况下,您可能可以从 InputStream 读取并得到您要查找的内容。

    所以你的代码最终会看起来像:

    async Task<string> GetVpnStatus()
    {
        var process = Java.Lang.Runtime.GetRuntime().Exec(new string[] { "su", "-c", "cat /data/misc/vpn/state" });
        var exitCode = await process.WaitForAsync();
    
        if (exitCode == 0)
        {
            using (var outputStreamReader = new StreamReader(process.InputStream))
                return await outputStreamReader.ReadToEndAsync();
        }
    
        if (process.ErrorStream != null)
        {
            using (var errorStreamReader = new StreamReader(process.ErrorStream))
                return await errorStreamReader.ReadToEndAsync();
        }
    
        return null;
    }
    

    这个结果看起来像

    ppp0
    10.0.0.42/32
    0.0.0.0/0
    105.112.3.1 123.234.12.55
    

    【讨论】: