Writing android app that executes linux commands

Writing android app that executes linux commands

I have an compiled executable that is supposed to copy itself from the res folder, and into the /data/data/package-name/ folder, and change the permissions, and then execute. Every step completes all the way to the end. The output stream seems to be writing, etc. Except when I go check the file system, nothing has been done. I first tried with ‘sh’ then with ‘su’ (I have a rooted Cyanogen rom).
Here is the code:
public class UnexecutableActivity extends Activity {

String executablePath;
TextView outputView;
private UnexecutableTask mUnexecutableTask;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
executablePath = getIntent().getData().getPath();
System.out.println(executablePath);
setContentView(R.layout.main);
outputView = (TextView)findViewById(R.id.outputView);
try {
Process process = Runtime.getRuntime().exec(“su”);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Runnable runexecutable = new Runnable(){

@Override
public void run() {
mUnexecutableTask = new UnexecutableTask();
mUnexecutableTask.execute(“”);
}

};

runOnUiThread(runexecutable);

}

private class UnexecutableTask extends AsyncTask {

public UnexecutableTask() {
super();
}

@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
outputView.setText(outputView.getText() + “\n” + executablePath + “converted to “);
}

@Override
protected void onPreExecute() {
super.onPreExecute();
outputView.setText(“About to un-executable ” + executablePath + ” …”);
}

@Override
protected void onProgressUpdate(String… values) {
super.onProgressUpdate(values);
outputView.setText(outputView.getText() + “\n” + values[0]);
}

@Override
protected String doInBackground(String… params) {
String bashEscapedPath = executablePath.replace(” “, “\\ “);
try{
String[] commands;
publishProgress(“Loading unexecutable…”);
InputStream unexecutableInputStream = getAssets().open(“unexecutable”);
FileOutputStream fos = new FileOutputStream(getDir(“”, MODE_WORLD_WRITEABLE) + “/unexecutable”);
byte[] tmp = new byte[2048];
int l;
while ((l = unexecutableInputStream.read(tmp)) != -1) {
fos.write(tmp, 0, l);
}
fos.flush();
fos.close();
unexecutableInputStream.close();

publishProgress(“Changing file permissions…”);
commands = new String[] {“/system/bin/chmod”,”744″, getDir(“”, MODE_WORLD_WRITEABLE) + “/unexecutable”};
Process process = Runtime.getRuntime().exec(“su”);
StringBuffer res = new StringBuffer();
DataOutputStream os = new DataOutputStream(process.getOutputStream());
DataInputStream osRes = new DataInputStream(new
BufferedInputStream(process.getInputStream()));
for (String single : commands) {
os.writeBytes(single + “\n”);
os.flush();
//publishProgress(String.valueOf(osRes.readByte()));
}
os.writeBytes(“exit\n”);
os.flush();
process.waitFor();

Related:  How do you find the original user through multiple sudo and su commands?

publishProgress(“Performing un-executable…”);
commands = new String[] {“/data/data/” + getPackageName() + “/unexecutable”, bashEscapedPath};
process = Runtime.getRuntime().exec(“su”);
res = new StringBuffer();
os = new DataOutputStream(process.getOutputStream());
osRes = new DataInputStream(process.getInputStream());
for (String single : commands) {
os.writeBytes(single + “\n”);
os.flush();
}
os.writeBytes(“exit\n”);
os.flush();
publishProgress(“Finishing…”);
process.waitFor();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return “Success”;
}

}

If anyone could fix this up for me, (and hopefully use sh!) I would be eternally grateful.

Solutions/Answers:

Solution 1:

Not you should not use shell commands. The SDK does not include any shell commands, and you can not rely on these working consistently across devices. You definitely can’t rely on su working across devices. :}

Solution 2:

    executablePath = getIntent().getData().getPath();

This line is giving a null pointer exception for me. Apparently the URI (java.net.Uri) returned by getIntent().getData is null. I am trying to work around it and see if I can create the file with the rest of your code.

References