xargs не генерирует правильную команду

У меня была такая же проблема. Запустите двоичный файл airmon-ng:

sudo airmon-ng start wlan0.

Виртуальный интерфейс поверх wlan0 будет создан с включенным режимом монитора.

Результат, который я получил с помощью ifconfig, показан ниже.

mon0      Link encap:UNSPEC  HWaddr 88-9F-FA-79-66-C1-3A-30-00-00-00-00-00-00-00-00  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2695503 errors:0 dropped:1416652 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:596242234 (596.2 MB)  TX bytes:0 (0.0 B)

Затем откройте wirehark и выберите этот интерфейс для захвата пакетов в режиме мониторинга.

7
08.05.2017, 14:21
2 ответа

Перенаправление вывода adb shell ls /data/data | grep -i com.company в файл и просмотрев его с помощью шестнадцатеричного редактора, я обнаружил, что к ним добавлен возврат каретки в стиле Windows \r\n (0x0D 0x0A). Таким образом, избавление от \r с помощью tr -d '\r' решило проблему.

Вся команда с использованием for (из ответа Stéphane Chazelas ):

for x in $(adb shell ls /data/data | grep -i com.company | tr -d '\r'); do adb uninstall $x;  done

Или аналогичным образом с использованием xargs:

adb shell ls /data/data | grep -i com.company | tr -d '\r' | xargs -r -n1 adb uninstall

Другой вариант (как любезно объяснено Stéphane Chazelas в комментариях ниже) полностью отключает \r с помощью stty -opost, хотя для этого, скорее всего, требуется busybox (или альтернатива, такая как toybox) для установки на Android-устройство.

$ adb shell echo test | sed -n l               
test\r$
$ adb shell 'busybox stty -opost; echo test' | sed -n l
test$
4
27.01.2020, 20:16

Хотя проблема оказалась вызванной символами CR в adb shellвыводе (, вставленном дисциплиной строки tty pty, созданной в целевой системе Android (, см. здесь для получения более подробной информации )), другое возможное объяснение (, и я оставлю его там для будущих читателей, так как это общая проблема с xargs), которая могла быть в:

adb shell ls /data/data | grep -i com.company | xargs -n1 adb uninstall

В зависимости от реализации xargsstdin adbбудет либо /dev/null, либо конвейером из grep. В любом случае это не будет tty, и, возможно, поэтому adbдает сбой, если предполагается, что он сможет взаимодействовать с пользователем.

С GNU xargsи оболочкой с поддержкой замены процесса (, такой как zsh), вы можете изменить его на:

xargs -n1 -ra <(adb shell ls /data/data | grep -i com.company) adb uninstall

В этом случае xargsсчитывает список из файла, указанного в качестве аргумента для -a, что позволяет вам не трогать стандартный ввод.

Или, поскольку вы упомянули zsh, вы могли бы использовать:

autoload zargs # best in ~/.zshrc
zargs -L1 $(adb shell ls /data/data | grep -i com.company) -- adb uninstall

(использование -Lвместо -n, так как zargs-nограничивает общее количество аргументов до adb(, включая uninstallодин ), что означает, что мы нужно-n 2).

Или просто используйте цикл, который в этом случае будет еще короче и понятнее:

for x ($(adb shell ls /data/data | grep -i com.company)) adb uninstall $x
8
27.01.2020, 20:16

Теги

Похожие вопросы