<string name="error_opening_file">Error opening file %1$s (%2$s)</string>
<string name="file_received">File received</string>
<string name="reboot_failed">Reboot failed</string>
+ <string name="sh_help">
+ Usage: sh command [arg1 arg2 ...]\n
+ Executes a shell command and returns its output. FonBot waits for the command to finish, therefore this must not be used with long-running commands.\n
+ Example: sh ls /sdcard/
+ </string>
+ <string name="rootsh_help">
+ Usage: rootsh command [arg1 arg2 ...]\n
+ Executes a shell command as root and returns its output. FonBot waits for the command to finish, therefore this must not be used with long-running commands. This requires root access.\n
+ Example: rootsh stop;sleep 3;start
+ </string>
</resources>
import static ro.ieval.fonbot.R.string.*;
import static ro.ieval.fonbot.Utils.toNonNull;
+import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
+import java.io.InputStreamReader;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;
case TORCH:
Utils.sendMessage(context, replyTo, torch_help);
break;
+ case SH:
+ Utils.sendMessage(context, replyTo, sh_help);
+ break;
+ case ROOTSH:
+ Utils.sendMessage(context, replyTo, rootsh_help);
+ break;
}
}
public static void getfile(final Context context, final Address replyTo, final String filename, final String hostname, final int port){
new GetfileExecutableRunnable(context, replyTo, filename, hostname, port).execute();
}
+
+ /**
+ * Execute a command using a given shell and reply with the output.
+ *
+ * @param context Context instance
+ * @param replyTo reply Address
+ * @param shell The shell to execute with. Usually sh or su.
+ * @param command The command to pass to the shell.
+ */
+ public static void execute(final Context context, final Address replyTo, final String shell, final String command) {
+ try {
+ final Process proc = Runtime.getRuntime().exec(new String[]{
+ shell,
+ "-c",
+ command
+ });
+ final BufferedReader br = new BufferedReader (new InputStreamReader(proc.getInputStream()));
+ String line;
+ while((line = br.readLine()) != null)
+ Utils.sendMessage(context, replyTo, line);
+ proc.waitFor();
+ } catch (final Exception e){
+ Utils.sendMessage(context, replyTo, error_while_processing_command, e.getClass().getName(), e.getMessage());
+ Log.w(Heavy.class.getName(), "Error while processing command", e);
+ }
+ }
}
LS, RM, CONTACTS, DISABLE, ENABLE,
POLL, HANGUP, ANSWER, LAUNCH, DATA,
GPS, GLOCATION, REBOOT, NOTIFY, SCREENCAP,
- TORCH, GETFILE
+ TORCH, GETFILE, SH, ROOTSH
}
/**
}
Heavy.getfile(context, replyTo, toNonNull(args[0]), toNonNull(args[1]), getfilePort);
break;
+
+ case SH:
+ if(args.length == 0){
+ Heavy.help(context, replyTo, toNonNull(Command.SH));
+ return;
+ }
+
+ Heavy.execute(context, replyTo, "sh", join(" ", args));
+ break;
+
+ case ROOTSH:
+ if(args.length == 0){
+ Heavy.help(context, replyTo, toNonNull(Command.ROOTSH));
+ return;
+ }
+
+ Heavy.execute(context, replyTo, "su", join(" ", args));
+ break;
}
}