`
fonter
  • 浏览: 869157 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ShellCommand.java

阅读更多

/**
 * ShellCommand.java runs commands as if in a native shell instance, and can return stdio.
 *
 * Code by Kevin(at)TeslaCoil
 * Adapted by LouZiffer(at)SDX
 *
 * Example usage (use cmd.su.runWaitFor instead of cmd.sh.runWaitFor to run as su):
 *
 * ShellCommand cmd = new ShellCommand();
 * CommandResult r = cmd.sh.runWaitFor("/system/bin/getprop wifi.interface");
 *
 * if (!r.success()) {
 *     Log.d(MSG_TAG, "Error " + r.stderr);
 * } else {
 *     Log.d(MSG_TAG, "Successfully executed getprop wifi.interface. Result: " + r.stdout);
 *     this.tetherNetworkDevice = (r.stdout);
 * }
 */

package m900.tether.system;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;

import android.util.Log;

public class ShellCommand {
    private static final String TAG = "ShellCommand.java";
    private Boolean can_su;   

    public SH sh;
    public SH su;
   
    public ShellCommand() {
        sh = new SH("sh");
        su = new SH("su");
    }
   
    public boolean canSU() {
        return canSU(false);
    }
   
    public boolean canSU(boolean force_check) {
        if (can_su == null || force_check) {
            CommandResult r = su.runWaitFor("id");
            StringBuilder out = new StringBuilder();
           
            if (r.stdout != null)
                out.append(r.stdout).append(" ; ");
            if (r.stderr != null)
                out.append(r.stderr);
           
            Log.v(TAG, "canSU() su[" + r.exit_value + "]: " + out);
            can_su = r.success();
        }
        return can_su;
    }

    public SH suOrSH() {
        return canSU() ? su : sh;
    }
   
    public class CommandResult {
        public final String stdout;
        public final String stderr;
        public final Integer exit_value;
       
        CommandResult(Integer exit_value_in, String stdout_in, String stderr_in)
        {
            exit_value = exit_value_in;
            stdout = stdout_in;
            stderr = stderr_in;
        }
       
        CommandResult(Integer exit_value_in) {
            this(exit_value_in, null, null);
        }
       
        public boolean success() {
            return exit_value != null && exit_value == 0;
        }
    }

    public class SH {
        private String SHELL = "sh";

        public SH(String SHELL_in) {
            SHELL = SHELL_in;
        }

        public Process run(String s) {
            Process process = null;
            try {
                process = Runtime.getRuntime().exec(SHELL);
                DataOutputStream toProcess = new DataOutputStream(process.getOutputStream());
                toProcess.writeBytes("exec " + s + "\n");
                toProcess.flush();
            } catch(Exception e) {
                Log.e(TAG, "Exception while trying to run: '" + s + "' " + e.getMessage());
                process = null;
            }
            return process;
        }
       
        private String getStreamLines(InputStream is) {
            String out = null;
            StringBuffer buffer = null;
            DataInputStream dis = new DataInputStream(is);

            try {
                if (dis.available() > 0) {
                    buffer = new StringBuffer(dis.readLine());
                    while(dis.available() > 0)
                        buffer.append("\n").append(dis.readLine());
                }
                dis.close();
            } catch (Exception ex) {
                Log.e(TAG, ex.getMessage());
            }
            if (buffer != null)
                out = buffer.toString();
            return out;
        }

        public CommandResult runWaitFor(String s) {
            Process process = run(s);
            Integer exit_value = null;
            String stdout = null;
            String stderr = null;
            if (process != null) {
                try {
                    exit_value = process.waitFor();
                   
                    stdout = getStreamLines(process.getInputStream());
                    stderr = getStreamLines(process.getErrorStream());
                   
                } catch(InterruptedException e) {
                    Log.e(TAG, "runWaitFor " + e.toString());
                } catch(NullPointerException e) {
                    Log.e(TAG, "runWaitFor " + e.toString());
                }
            }
            return new CommandResult(exit_value, stdout, stderr);
        }
    }
}

分享到:
评论

相关推荐

    NativeIO和YARNRunner修改后的源码

    at org.apache.hadoop.util.Shell.runCommand(Shell.java:538) at org.apache.hadoop.util.Shell.run(Shell.java:455).... 这是hadoop本身的一个bug,可以通过修改NativeIO和YARNRunner的源码并替换解决。这是这两个...

    ShellUtils.java,Android adb shell执行类

    一个用于在Android开发中 执行adb shell命令的类,可以以最高权限(su)执行。例如mount命令等

    hadoop-2.6.0-hadoop.dll-winutils.exe

     at org.apache.hadoop.util.Shell.runCommand(Shell.java:482)  at org.apache.hadoop.util.Shell.run(Shell.java:455)  at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:715)  at ...

    基于Java的开发的SHELL CRaSH.zip

    这个名称暗示了它可能是一个名为CRaSH(Command-line Remote Shell)的工具,版本为1.1.0。CRaSH是一个用于Java应用程序的轻量级命令行接口,允许开发者远程控制和管理Java应用,比如运行JVM上的脚本、查看系统信息...

    java调用Shell脚本.doc

    import java.io.InputStreamReader; import java.io.LineNumberReader; public class RunShell { public static void main(String[] args) { try { // 调用Shell脚本 Process process = Runtime.getRuntime()...

    java源码:Java开发的SHELL CRaSH.gz

    这个文件很可能是Java实现的一个名为CRaSH(Command-line Remote Shell)的开源工具的源代码,版本为1.1.0。CRaSH是一个用于Java应用的轻量级、基于HTTP协议的命令行shell,允许开发者在远程服务器上执行命令和管理...

    shell 脚本调用Java类

    Please install Java." exit 1 fi # 执行Java程序 java $JAVA_CLASS_PATH $MAIN_CLASS ``` 这个脚本首先通过`command -v java`检查Java是否在PATH环境变量中,然后使用`java`命令执行Java程序。`JAVA_CLASS_PATH...

    Shell run Java

    当`CLASSPATH`没有正确设置时,Java虚拟机可能会抛出`java.lang.ClassNotFoundException`异常。为了避免这种情况发生,需要确保所有必需的JAR文件都已经被正确地添加到了`CLASSPATH`中。 #### 五、总结 通过上述...

    Android-ExecuteShell是一个可以方便的执行shell命令的Android开源库

    ExecuteShell.executeCommand("ls /sdcard", new ShellCallback() { @Override public void onCommandResult(int commandCode, CommandResult result) { // 处理命令结果 } }); ``` 这里使用了异步方式执行`...

    shell脚本启动Java程序测试工程

    command -v java &> /dev/null; then echo "Java 不可用,请确保已安装 Java 并将其添加到 PATH 中。" exit 1 fi ``` 或者,如果你的应用依赖于特定版本的Java,你可以指定版本: ```bash JAVA_VERSION="1.8" ...

    Android 如何执行shell脚本.doc

    import java.io.InputStreamReader; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class HelloCommand extends Activity { private TextView tv; @...

    Java 调用 Shell 命令

    import java.io.FileOutputStream; import java.io.OutputStreamWriter; public class FileCreator { public static void main(String[] args) { String filePath = "/path/to/your/file.txt"; try ...

    java linux ssh登陆

    4. **建立通道**:通过`Session`创建一个`Channel`,通常是`ChannelShell`或`ChannelExec`,前者提供一个交互式的shell,后者用于执行命令。 5. **执行命令**:对于`ChannelExec`,调用`setCommand()`方法指定要执行...

    java控制台输入cmd命令, ssh远程linux shell命令, 并打印命令输出到控制台

    import java.io.BufferedReader; import java.io.InputStreamReader; public class CmdExecutor { public static void main(String[] args) { try { // 创建Runtime实例 Runtime runtime = Runtime.getRuntime...

    'FrontEnd Plus' The GUI for the fast JAva Decompiler.

    It is handled by Jad rather than the command shell, so on UNIX the last argument should be single-quoted: jad -o -r -sjava -dsrc 'tree/**/*.class' In a case you want to check the accuracy of the ...

    java+powershell 控制windows

    在 Java 中,我们可以使用 `java.lang.Runtime.getRuntime().exec()` 方法来执行外部命令。对于 PowerShell,我们需要先启动 PowerShell 进程,然后执行相应的命令。例如,调用 `powershell.exe -Command "& {Your ...

    Java开发的SHELL CRaSH.gz

    CRaSH,全称“Command-line Remote Shell”,是一个轻量级的Java库,允许开发者为他们的Java应用程序添加命令行接口,这样就可以通过SSH(Secure SHell)或者其他网络协议远程管理这些应用。这个工具在分布式系统、...

    java调用shell脚本执行sqlldr与存储过程

    在java代码中调用执行shell脚本,sqlldr导数与使用sqlplus在shell调用执行存储过程。 linux环境中有2个dba的用户:oracle、erm 还有1个web用户:erm 在linux环境中,这三个用户都可以直接在任意目录下执行该shell...

Global site tag (gtag.js) - Google Analytics