Как локально запускать команды "adb shell" в эмуляторе терминала на устройстве Android?

Из оболочки на моем ПК я могу запустить adb shell cmd package list packagesи получите список всех установленных пакетов. Я хотел бы запускать эту и аналогичные команды локально на моем телефоне Android (Nexus 6P) в эмуляторе терминала (в настоящее время использующем Termux).

Если я открою ту же оболочку с /system/bin/sh, а затем попробуйте запустить /system/bin/cmd package list packagesничего не происходит (ошибок нет, просто ничего не выводится и перезагружается подсказка).

Если я бегу /system/bin/cmd -l список опций выглядит так, как ожидалось. $PATH а также $LD_LIBRARY_PATH одинаковы в обеих средах. Одним из основных отличий является то, что echo $USER возвращает "оболочку" из adb shell, но возвращает мое локальное имя пользователя из /system/bin/sh запущен из Termux.

Есть ли способ повторить поведение команд, запущенных из adb shell в эмуляторе терминала локально на Android?

Изменить: мое устройство рутирован, и я в порядке с решениями только для root.

2 ответа

У меня нет удобного рутированного устройства Nougat, но что-то вроде следующего может быть достаточно близким к adb shell (при условии, что вы используете SuperSU):

env -i USER=shell "$(PATH=/system/xbin:/system/bin:/su/bin:/sbin:/magisk/.core/bin which su)" shell --context u:r:shell:s0 --shell /system/bin/sh --command COMMAND

Я (очень кратко) протестировал его от Termux на устройстве с корневым зефиром.

Разработать:

  • -i флаг используется для запуска с пустой средой
  • USER=shell специально не требуется, но по какой-то причине su отказывается работать с совершенно пустой средой
  • $(PATH=/system/xbin:/system/bin:/su/bin:/sbin:/magisk/.core/bin which su) указывает на полный путь двоичного файла su на вашем устройстве и может быть жестко запрограммирован, если вы предпочитаете
  • shell инструктирует su двоичный файл для входа в систему как пользователь оболочки (так же, как adb shell)
  • --context u:r:shell:s0 устанавливает соответствующий контекст SELinux
  • --shell /system/bin/sh поручает SuperSU использовать системную оболочку, а не свою собственную sush ракушка

Другой вариант - запустить adb с устройства, подключившись к нему через TCP. Если вам нужны некоторые функции, которые доступны только через ADB (например, в моем случае это было adb forward) тогда это может быть вашим единственным вариантом. К сожалению, это не особенно удобно.

Я не смог добиться успеха ни с какими общедоступными двоичными файлами adb, поэтому я собрал его сам, с небольшими изменениями. Вы можете увидеть источники, которые я использовал, и изменения, которые я сделал на https://github.com/shakalaca/fastboot-adb-android и https://github.com/brbsix/fastboot-adb-android, соответственно.

После того, как вы установили adb, вот сокращенный список команд, которые я использовал для подключения к устройству:

# Add iptables rules to block external connections to port 9999'
su root iptables -N adbd
su root iptables -A adbd -i lo -p tcp -m tcp --dport 9999 -j ACCEPT
su root iptables -A adbd -p tcp -m tcp --dport 9999 -j DROP
su root iptables -A INPUT -j adbd

# Necessary in order to display authorization prompt
su shell setprop ro.debuggable 1

su shell setprop service.adb.tcp.port 9999

su root start adbd

adb connect 127.0.0.1:9999

adb wait-for-local-device

Выключить:

adb kill-server
su root stop adbd
su shell setprop ro.debuggable 0
su shell setprop service.adb.tcp.port 0
su root iptables -D INPUT -j adbd
su root iptables -F adbd
su root iptables -X adbd

Проблема в Termux. По своей природе Termux запускает только (или в основном?) Программы командной строки Linux, которые вы устанавливаете из Termux, используя apt или более новый "нативный" интерфейс управления пакетами, например, apt install bsdtar. Для запуска команд оболочки adb вам необходим эмулятор терминала, который может по-настоящему получить доступ к базовой файловой системе Android, а не только к Termux, который практически не использует chroot, поскольку он осознает, что не запускает команды из корневой файловой системы /.

В качестве простого теста выполните следующую команду:

    which ls

Должно вернуть что-то вроде /system/bin/ls, Но если он возвращает что-то вроде /data/data/com.termux/files/usr/bin/applets/ls тогда вы должны изменить свой эмулятор терминала на что-то другое. Я подозреваю, что Termux был разработан с учетом более строгих политик выполнения оболочки, которые Google ввел в действие после KitKat или Android 4.X.

Линейный дистрибутив Android, LineageOS 14.1, который я использую, поставляется со встроенным эмулятором оболочки, который позволяет мне запускать команды из /system/bin/ls.

Итак, я пробовал это недавно... если у вас есть root-права, вы можете использовать эмулятор терминала.

  • вс
  • затем желаемую команду без части "adb shell".

Я попробовал команду "adb shell dumpsys deviceidle force-idle", чтобы заставить устройство спать. Я сделал это на устройстве через эмулятор терминала как: "dumpsys deviceidle force-idle", и это сработало. также работала команда dumpsys batterystats.

будьте осторожны с командами с расширенным выводом текста, так как экран будет заполнен выводом и какое-то время не будет отвечать на запросы.

ИЗМЕНИТЬ Я изначально ответил на это безtermuxпомните. Это сработало для меня, когда я пытался выполнять команды оболочки на ванильном эмуляторе, и увидел этот вопрос во время исследования, поэтому я попытался ответить на него по-другому.

Вы почти ответили на этот вопрос. Вам нужно только выполнитьsh:

int result = -1;
try {
    final Process shell = Runtime.getRuntime().exec("sh");
    final DataOutputStream commands = new DataOutputStream(shell.getOutputStream());
    commands.writeBytes("write a series");
    commands.writeBytes("of commands here");
    commands.writeBytes("exit\n");
    commands.flush();
    result = shell.waitFor();
  }
} catch (Exception e) {
  e.printStackTrace();
}

Если result == 0 команды были успешными, иначе

  • Только рутированный андроид
  • Busybox должен быть установлен (хотя можно попробовать и без него)

Просто напишите обычную команду без префикса adb

Другие вопросы по тегам