6

Hi i'm developing an application which requires me to run some bash code is there a way i can hard code the script into my app and then run it? For instance (this is a VERY simplified example)

#!/system/bin/sh
#

if [ ! -f /sdcard/hello.txt ]
then
echo 'Hello World' >> /sdcard/hello.txt
else
echo 'Goodbye World' >> /sdcard/goodbye.txt
fi

I have the following method for running one line bash commands but need to run something like that that's on multiple lines. Again that above code is a very simplified example what I am actually doing must be run through a script and can't be done through java. I also want to have it hard coded I know could have the script stored on the phone and run it with the following but do not want the script just out there would rather it hard coded in the app.

public Boolean execCommand(String command) 
    {
        try {
            Runtime rt = Runtime.getRuntime();
            Process process = rt.exec("su");
            DataOutputStream os = new DataOutputStream(process.getOutputStream()); 
            os.writeBytes(command + "\n");
            os.flush();
            os.writeBytes("exit\n");
            os.flush();
            process.waitFor();
        } catch (IOException e) {
            return false;
        } catch (InterruptedException e) {
            return false;
        }
        return true; 
    }

Thank you for any help with my issue

1 Answer 1

8

If I understand you correctly, all you have to do is change the one line example method to something which accepts and sends multiple lines, like so:

    public Boolean execCommands(String... command) {
    try {
        Runtime rt = Runtime.getRuntime();
        Process process = rt.exec("su");
        DataOutputStream os = new DataOutputStream(process.getOutputStream());

        for(int i = 0; i < command.length; i++) {
            os.writeBytes(command[i] + "\n");
            os.flush();
        }
        os.writeBytes("exit\n");
        os.flush();
        process.waitFor();
    } catch (IOException e) {
        return false;
    } catch (InterruptedException e) {
        return false;
    }
    return true; 
}

That way, you can call your multiline bash commands like so:

    String[] commands = {
            "echo 'test' >> /sdcard/test1.txt",
            "echo 'test2' >>/sdcard/test1.txt"
    };

    execCommands(commands);

    String commandText = "echo 'foo' >> /sdcard/foo.txt\necho 'bar' >> /sdcard/foo.txt";

    execCommands(commandText.split("\n"));
Sign up to request clarification or add additional context in comments.

3 Comments

thanks for the code going to give this a try in a few minutes hope it works well :)
worked exactly as i wanted the second method for running it will be very helpful thanks a ton!
I am using the same thing but its not working for me. Is it really working for you?? I am using system app.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.