27
votes

I have created a script to mount partitions and do some stuff in my Android system. I saved the script as install.sh in the /bin folder of Android.

I want to call the script from ADB, which is itself called from a batch file on Windows, but it needs to be executed as root.

The first solution I tried was to call the script using

adb shell "su -c sh /bin/script.sh"

but it does not work as it gives me a shell access (with root permissions), but nothing is executed. I also tried to call

adb root "sh /bin/script.sh"

but I got the following error

adbd cannot run as root in production builds

I then tried to write

su -c "command"

for all the commands which need a root access in my script, but I have the same problem. When I run the script I only obtain a root shell and nothing is executed.

If I use the first solution by hand (e.g. I call adb shell su, then my script), it works. However the whole point is to automate the process, so that adb shell can be called from another script.

Do you have any idea of how I could achieve this ?

Thanks !

6
I found my solution here.Nae

6 Answers

59
votes

This works for me:

Create myscript.bat and put into it (note the single quotes around the commands to be executed in superuser mode):

adb shell "su -c 'command1; command2; command3'"

then run myscript.bat from a DOS shell.

Note: it doesn't appear that the the DOS line continuation character (^) works in this situation. In other words, the following doesn't work for me:

adb shell "su -c '^
command1; ^
command2; ^
command3'"

This results in "Syntax error: Unterminated quoted string"

4
votes

This works :

adb shell echo command which needs root privileges \| su

If you need redirection:

adb shell echo 'echo anytext > /data/data/aforbiddenfolder/file' \| su

For "copying" a local file to an android path needing root privileges (but alocalfile must not contain '):

cat alocalfile | adb shell echo "echo '`cat`' > /data/data/aforbiddenfolder/file" \| su

If you have a better way (even for su versions which don't have -c), I am interested.

2
votes

This works for me:

adb shell "su -c ./data/local/tcpdump-arm -s 0 -v -w /data/local/appxpress_dump.pcap"
1
votes

I am not sure if I provided a solution or asked for a better one. I wanted to run some 200 command in batch mode to be sent to adb I followed this approach

    adb shell "su -c command ; "
adb shell "su -c command ; "
adb shell "su -c command ; "
adb shell "su -c command ; "

and I saved them in a batch file

This command

adb shell "su -c 'command1; command2; command3'"

will not work beyond a certain max size . It did not work

error: service name too long
0
votes

but it does not work as it gives me a shell access (with root permissions), but nothing is executed.

How do you know that you are given root permissions? I assume you are attempting to execute the script on a device? Has your device been rooted?

You may need to give execute permissions via chmod to the file.

chmod ugo=rwx /bin/script.sh
0
votes

It appears that I was using a very simple version of su which did not accept the -c argument. I copied another su which did work. AndyD is totally right though, so I am accepting his answer instead of mine :)