Проблемы с сетью Android Chroot

find . -name '*.py' -exec grep something {} \; -print

выведет имя файла после совпадающих строк.

find . -name '*.py' -exec grep something /dev/null {} +

выводит имя файла перед каждой совпадающей строкой (мы добавляем /dev/null для случая, когда есть только один совпадающий файл, поскольку grep не выводит имя файла, если ему передан только один файл для поиска. В GNU-реализации grep есть опция -H для этого в качестве альтернативы).

find . -name '*.py' -exec grep -l something {} +

выведет только имена файлов, в которых есть хотя бы одна совпадающая строка.

Чтобы вывести имя файла перед совпадающими строками, можно использовать awk:

find . -name '*.py' -exec awk '
  FNR == 1 {filename_printed = 0}
  /something/ {
    if (!filename_printed) {
      print FILENAME
      filename_printed = 1
    }
    print
  }' {} +

Или вызвать grep дважды для каждого файла - хотя это будет менее эффективно, поскольку для каждого файла будет выполняться как минимум одна команда grep и до двух (и дважды считываться содержимое файла):

find . -name '*.py' -exec grep -l something {} \; \
                    -exec grep something {} \;

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

Если вы хотите использовать shell-цикл, средствами GNU:

find . -name '*.py' -exec grep -l --null something {} + |
   xargs -r0 sh -c '
     for file do
       printf "%s\n" "$file"
       grep something < "$file"
     done' sh

(также работает на FreeBSD и производных).

1
06.11.2016, 22:18
1 ответ

У вас есть 2 разные проблемы

  • не удается разрешить DNS
  • пинг не работает

-


APT НЕ РАЗРЕШАЕТ DNS:

Проблема в том, что APT использует _apt в качестве нашего непривилегированного пользователя. На Android с параноидальной сетью только пользователи из группы 3003 aid_inet или 3004 aid_inet_raw могут открывать сетевые сокеты. При установке apt создает пользователя _apt.

    # add unprivileged user for the apt methods
     adduser --force-badname --system --home /nonexistent  \
       --no-create-home --quiet _apt || true

Пользователь выглядит так в / etc / passwd

    root@localhost:~
    # grep -E "_apt" /etc/passwd
    _apt:x:103:65534::/nonexistent:/bin/false

Формат passwd:

Имя пользователя: Зашифрованный пароль: Идентификационный номер пользователя (UID): Идентификационный номер группы пользователей (GID): Полное имя пользователя (GECOS ): Домашний каталог пользователя: Оболочка входа

, смотрящая на пользователя _apt, GID установлен на 65534, что означает отсутствие группы, в обычных системах Linux это нормально.На Android этот GID никогда не сможет устанавливать сетевые подключения Необходимо изменить GID на 3003

# usermod -g 3003 _apt изменит GID

    root@localhost:~
    # grep -E "_apt" /etc/passwd
    _apt:x:103:3003::/nonexistent:/bin/false

Теперь APT будет работать на Android chroot

PING НЕ РАБОТАЕТ


Я заметил, что когда я chroot использовал этот пример команды

# chroot / linux / bin / bash -l

В Android группы используются для приложений, в некоторой степени. Итак, root, вызывающий bash, находится только в корневой группе , вы можете проверить это по

    # groups
     root

группам, запущенным без имени пользователя, выводам текущих групп процессов

Теперь попробуйте это

# su - root

su command is switch user

    # groups
    root sdcard-rw aid_bt aid_bt-net aid_inet aid_net-raw aid_net_admin

Теперь ping будет работать

Теперь я использую

# chroot / linux / bin / su - root

, который входит в систему как root из Linux, а не как root из Android

{ {1}}
4
27.01.2020, 23:34

Теги

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