diff --git a/README.md b/README.md index 0c5beb7b..88773e12 100644 --- a/README.md +++ b/README.md @@ -307,6 +307,7 @@ Undocumented system binaries are all bundled and executable: * `ip` (`link monitor neigh rule`); * `ndc` (`ipfwd` since API 23, `nat` since API 28); * `iptables`, `ip6tables` (with correct version corresponding to API level, `-nvx -L `); +* `sh`; * `su`. If some of these are unavailable, you can alternatively install a recent version (v1.28.1 or higher) of Busybox. diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/root/MiscCommands.kt b/mobile/src/main/java/be/mygod/vpnhotspot/root/MiscCommands.kt index 6ef4b858..c3339e2c 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/root/MiscCommands.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/root/MiscCommands.kt @@ -19,14 +19,12 @@ import java.io.FileOutputStream import java.io.InterruptedIOException import java.util.concurrent.Executor -val SHELL = System.getenv("SHELL") ?: "sh" - @Parcelize class Dump(val path: String, val cacheDir: File = app.deviceStorage.codeCacheDir) : RootCommandNoResult { @Suppress("BlockingMethodInNonBlockingContext") override suspend fun execute() = withContext(Dispatchers.IO) { FileOutputStream(path, true).use { out -> - val process = ProcessBuilder(SHELL).redirectErrorStream(true).start() + val process = ProcessBuilder("sh").redirectErrorStream(true).start() process.outputStream.bufferedWriter().use { commands -> // https://android.googlesource.com/platform/external/iptables/+/android-7.0.0_r1/iptables/Android.mk#34 val iptablesSave = if (Build.VERSION.SDK_INT < 24) File(cacheDir, "iptables-save").absolutePath.also { diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/root/RoutingCommands.kt b/mobile/src/main/java/be/mygod/vpnhotspot/root/RoutingCommands.kt index cf5e0b32..c90ad964 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/root/RoutingCommands.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/root/RoutingCommands.kt @@ -16,7 +16,7 @@ object RoutingCommands { class Clean : RootCommandOneWay { @Suppress("BlockingMethodInNonBlockingContext") override suspend fun execute() = withContext(Dispatchers.IO) { - val process = ProcessBuilder(SHELL).redirectErrorStream(true).start() + val process = ProcessBuilder("sh").redirectErrorStream(true).start() process.outputStream.bufferedWriter().use(Routing.Companion::appendCleanCommands) when (val code = process.waitFor()) { 0 -> { } @@ -48,7 +48,6 @@ object RoutingCommands { class Process(val command: List, private val redirect: Boolean = false) : RootCommand { @Suppress("BlockingMethodInNonBlockingContext") override suspend fun execute() = withContext(Dispatchers.IO) { - val command = if (command[0] == "sh") listOf(SHELL) + command.drop(1) else command val process = ProcessBuilder(command).redirectErrorStream(redirect).start() coroutineScope { val output = async { process.inputStream.bufferedReader().readText() }