通过 ADB 以 root 身份启动脚本

Posted

技术标签:

【中文标题】通过 ADB 以 root 身份启动脚本【英文标题】:Launch a script as root through ADB 【发布时间】:2012-02-04 10:16:07 【问题描述】:

我创建了一个脚本来挂载分区并在我的 android 系统中执行一些操作。我将脚本作为 install.sh 保存在 Android 的 /bin 文件夹中。

我想从 ADB 调用脚本,该脚本本身是从 Windows 上的批处理文件调用的,但需要以 root 身份执行。

我尝试的第一个解决方案是调用脚本使用

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

但它不起作用,因为它为我提供了 shell 访问权限(具有 root 权限),但没有执行任何操作。 我也试过打电话

adb root "sh /bin/script.sh"

但我收到以下错误

adbd cannot run as root in production builds

然后我试着写

su -c "command"

对于我的脚本中需要 root 访问权限的所有命令,但我有同样的问题。 当我运行脚本时,我只获得了一个 root shell,没有执行任何操作。

如果我手动使用第一个解决方案(例如,我调用 adb shell su,然后调用我的脚本),它就可以工作。然而,重点是自动化该过程,以便可以从另一个脚本调用 adb shell。

您知道我如何实现这一目标吗?

谢谢!

【问题讨论】:

我找到了我的解决方案here。 【参考方案1】:

这对我有用:

创建 myscript.bat 并放入其中(注意要在超级用户模式下执行的命令周围的单引号):

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

然后从 DOS shell 运行 myscript.bat。

注意:在这种情况下,DOS 行继续符 (^) 似乎不起作用。换句话说,以下内容对我不起作用:

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

这会导致“语法错误:未终止的带引号的字符串”

【讨论】:

这在我的三星 Note 4 Exynos 版本,系统版本 Android 4.4 上运行得非常好。我在网上搜索了一整天的解决方案。感谢上帝,我终于读到了这篇文章。有用。 RootAdb 以前可以在 Galaxy Note 10.1 平板电脑上工作,但现在不能在 Note4 上工作了。 在 Android 7.1.1 上,我发现在双引号中使用单引号实际上会弄乱执行。删除它们似乎使一切按预期工作。【参考方案2】:

这行得通:

adb shell echo command which needs root privileges \| su

如果需要重定向:

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

用于将本地文件“复制”到需要 root 权限的 android 路径(但本地文件不得包含'):

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

如果您有更好的方法(即使对于没有-csu 版本),我很感兴趣。

【讨论】:

当我像这样adb shell 'echo uname -a > /ggg.txt' \| su 运行带有输出重定向的命令时,我收到文件系统是只读的错误消息,但是当我通过adb shell su 以root 身份登录时,我可以成功运行相同的命令。这个问题有解决办法吗?【参考方案3】:

这对我有用:

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

【讨论】:

这个命令有什么新的地方还没有提到吗? 设备命令周围没有单引号。在我删除它们之后,一切都开始工作了。谢谢。【参考方案4】:

我不确定我是否提供了解决方案或要求提供更好的解决方案。 我想以批处理模式运行一些 200 条命令以发送到 adb 我遵循了这种方法

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

我把它们保存在一个批处理文件中

这个命令

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

将无法超过某个最大尺寸。它没有工作

error: service name too long

【讨论】:

【参考方案5】:

但它不起作用,因为它为我提供了 shell 访问权限(具有 root 权限),但没有执行任何操作。

你怎么知道你被授予root权限?我假设您正在尝试在设备上执行脚本?你的设备已经root了吗?

您可能需要通过 chmod 授予文件执行权限。

chmod ugo=rwx /bin/script.sh

【讨论】:

没有执行任何操作,但控制台显示一个外壳,我可以输入我的命令,带有“#”,这意味着我有 root 访问权限。是的,我的设备已植根。我的脚本也有执行权限,但是调用 sh /bin/script.sh 应该不需要这个权限吧? 啊,我什至没有意识到这一点,但是您不需要具有执行权限是正确的。您可以尝试“source /bin/script.sh”,看看是否有任何不同(可能不是)。【参考方案6】:

看来我使用的是一个非常简单的 su 版本,它不接受 -c 参数。 我复制了另一个确实有效的 su 。不过,AndyD 是完全正确的,所以我接受他的回答而不是我的 :)

【讨论】:

我的也不行。你从哪里复制的?

以上是关于通过 ADB 以 root 身份启动脚本的主要内容,如果未能解决你的问题,请参考以下文章

在启动问题上以root身份运行Python

以管理员用户身份重新启动 PowerShell 脚本

写了一个bat脚本,用来启动windows服务,系统是windows7.每次运行这个脚本都要右击选择以管理员身份运行。

VBS脚本运行批处理文件,不在启动时运行[重复]

我的php想用root权限调用shell脚本,怎么让apache拥有root权限,该http.conf为root,apache启动不了

谁来写一个linux下开机启动oracle的脚本