Менее конкретный вход для скрипта

Некоторое время назад, когда я искал способ узнать, что я могу удалить из своего deptree Android без вредоносных функций, которые я использую, я нашел deptree на xda forums . Поскольку это было написано еще в 2012 году, это не сработало бы так, как предполагалось. Обновление используемых инструментов ( dex2jar , smali , ... ) плюс некоторые незначительные изменения в сценариях (например, изменение папок на те, которые использовались в Android , например, system/app-private для system/priv-app/*/ ) и Я снова начал работать.
Часть волшебства происходит в трех сценариях, похожих на этот:

 while [ -n "$1" ]; do for bin in "$1"/*; do [ -f "$bin" ] || continue case "$bin" in *.so) ;; *) [ -x "$bin" ] || continue ;; esac "$FILE_DIR/perls/parse_bin.pl" "$bin" dbi:SQLite:dbname="$ACTIVE_DB/test.sqlite" 2>>"$ACTIVE_DB/logs/parse_bin.log" done shift done 

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

  1. при доступе к входной папке $1 ,
  2. каждый файл bin(ary) получает
  3. если он действительно является binary файлом, если это так,
    (я не знаю, что означает || )
  4. он проверяет расширение ( .so или none ) и
  5. использует найденные файлы ( *.so и те, которые не имеют расширения) в качестве входных данных для скрипта parse_bin.pl

Входная папка должна быть суперспецифичной, так как для этого скрипта это

 $ACTIVE_DB/rom/system/lib $ACTIVE_DB/rom/system/lib/*/ $ACTIVE_DB/rom/system/usr/lib you get how this continues, super long list of folders 

Что я хотел бы знать, как мне придется изменить эти три сценария, чтобы входная папка была $ACTIVE_DB/rom/system ?

EDIT: Механизм поиска файла (ов) во входных папках одинаковый во всех трех сценариях, за исключением того, что два других пользователя ищут *.jar и *.apk

EDIT2: оболочка bash используется для запуска этого

Я знаю, что это должно произойти где-то в первых двух строках скрипта, я уже попробовал ответить отсюда, который выплескивал бы каждый двоичный файл внутри папки $ACTIVE_DB/rom но не передавал бы их в качестве входных данных в parse_bin.pl .

У вас есть журнал:

 + PARSE_BIN DB_45763/rom/system + '[' -n DB_45763/rom/system ']' + for bin in '"$1"/*' + '[' -f DB_45763/rom/system/CSCVersion.txt ']' + case "$bin" in + '[' -x DB_45763/rom/system/CSCVersion.txt ']' + printf 'DB_45763/rom/system/CSCVersion.txt:\t' + echo DB_45763/rom/system/CSCVersion.txt + ./files/perls/parse_bin.pl DB_45763/rom/system/CSCVersion.txt dbi:SQLite:dbname=DB_45763/test.sqlite + for bin in '"$1"/*' + '[' -f DB_45763/rom/system/app ']' + continue + for bin in '"$1"/*' + '[' -f DB_45763/rom/system/bin ']' + continue + for bin in '"$1"/*' + '[' -f DB_45763/rom/system/build.prop ']' + case "$bin" in + '[' -x DB_45763/rom/system/build.prop ']' + printf 'DB_45763/rom/system/build.prop:\t' + echo DB_45763/rom/system/build.prop + ./files/perls/parse_bin.pl DB_45763/rom/system/build.prop dbi:SQLite:dbname=DB_45763/test.sqlite + for bin in '"$1"/*' + '[' -f DB_45763/rom/system/cameradata ']' + continue + for bin in '"$1"/*' + '[' -f DB_45763/rom/system/csc ']' + continue + for bin in '"$1"/*' + '[' -f DB_45763/rom/system/csc_contents ']' + continue + for bin in '"$1"/*' + '[' -f DB_45763/rom/system/etc ']' + continue + for bin in '"$1"/*' + '[' -f DB_45763/rom/system/fonts ']' + continue + for bin in '"$1"/*' + '[' -f DB_45763/rom/system/framework ']' + continue + for bin in '"$1"/*' + '[' -f DB_45763/rom/system/kern_sec_info ']' + case "$bin" in + '[' -x DB_45763/rom/system/kern_sec_info ']' + printf 'DB_45763/rom/system/kern_sec_info:\t' + echo DB_45763/rom/system/kern_sec_info + ./files/perls/parse_bin.pl DB_45763/rom/system/kern_sec_info dbi:SQLite:dbname=DB_45763/test.sqlite + for bin in '"$1"/*' + '[' -f DB_45763/rom/system/lib ']' + continue + shift + '[' -n '' ']' 

2 Solutions collect form web for “Менее конкретный вход для скрипта”

Во-первых, ваше предположение о том, что делает сценарий, кажется правильным. Он просматривает все файлы, папки, символические ссылки и т. Д., Которые он находит в $1 , если это файл, затем он углубляется глубже, чтобы определить, есть ли его библиотека или исполняемый файл.

В сценарии оболочки $1 это первый аргумент, переданный скрипту, поэтому для запуска этого скрипта с помощью $ACTIVE_DB/rom/system в позиции $1 вы просто вызываете скрипт с

 ./scriptname $ACTIVE_DB/rom/system 

Примечание. Если вы вызываете это из командной строки, $ACTIVE должен быть заменен фактическим путем.

Чтобы сделать этот скрипт рекурсивно решенным в ваш целевой каталог, вы можете попробовать добавить это в свой скрипт

 while [ -n "$1" ]; do # use globbing to descend into all subdirectories for bin in $(find "$1" | tr '\n' ' '); do # change this ^^^^ [ -f "$bin" ] || continue # leave the rest of the script as is # .... 

Поэтому, если кто-то задается вопросом, что я сделал, вот код на данный момент.
Спасибо @the_velour_fog за то, что помогли мне.
Если кто-то считает, что это худшее возможное решение
(я не думаю, что это супер сексуально, но он делает то, что он должен делать) получить их здесь.

  while [ -n "$1" ]; do for bin in $(find "$1"); do [ -f "$bin" ] || continue case "$bin" in *.so) export start=$(date +"%T") printf "$bin:\t" echo -n "$start " >>"$ACTIVE_DB/logs/parse_bin.log" echo "$bin" >>"$ACTIVE_DB/logs/parse_bin.log" "$FILE_DIR/perls/parse_bin.pl" "$bin" dbi:SQLite:dbname="$ACTIVE_DB/test.sqlite" 2>>"$ACTIVE_DB/logs/parse_bin.log" ;; *.jar) export start=$(date +"%T") printf "$bin:\t" echo -n "$start " >>"$ACTIVE_DB/logs/parse_jar.log" echo "$bin" >>"$ACTIVE_DB/logs/parse_jar.log" "$FILE_DIR/perls/parse_jar.pl" "$bin" dbi:SQLite:dbname="$ACTIVE_DB/test.sqlite" 2>>"$ACTIVE_DB/logs/parse_jar.log" ;; *.apk) export start=$(date +"%T") printf "$bin:\t" echo -n "$start " >>"$ACTIVE_DB/logs/parse_apk.log" echo "$bin" >>"$ACTIVE_DB/logs/parse_apk.log" "$FILE_DIR/perls/parse_apk.pl" "$bin" dbi:SQLite:dbname="$ACTIVE_DB/test.sqlite" 2>>"$ACTIVE_DB/logs/parse_apk.log" ;; *) if [ -x "$bin" ] ; then export start=$(date +"%T") printf "$bin:\t" echo -n "$start " >>"$ACTIVE_DB/logs/parse_bin.log" echo "$bin" >>"$ACTIVE_DB/logs/parse_bin.log" "$FILE_DIR/perls/parse_bin.pl" "$bin" dbi:SQLite:dbname="$ACTIVE_DB/test.sqlite" 2>>"$ACTIVE_DB/logs/parse_bin.log" else continue fi ;; esac done shift done 

Насколько я могу видеть сейчас, это работает, но я совершенно не уверен в этой части в конце

  *) if [ -x "$bin" ] ; then export start=$(date +"%T") printf "$bin:\t" echo -n "$start " >>"$ACTIVE_DB/logs/parse_bin.log" echo "$bin" >>"$ACTIVE_DB/logs/parse_bin.log" "$FILE_DIR/perls/parse_bin.pl" "$bin" dbi:SQLite:dbname="$ACTIVE_DB/test.sqlite" 2>>"$ACTIVE_DB/logs/parse_bin.log" else continue fi 

Будущее покажет ^^

  • Перемещение файлов по дате в другую папку с использованием CLI
  • Написание сценария, который показывает, сколько строк имеет «X» и «Y» в нем?
  • Последняя неудачная команда в bash
  • Уменьшить длину определенного столбца в текстовом файле с разделителями
  • создание сценария в Linux-машине для научных вычислений
  • Передача имени файла скриптам с функцией автозаполнения
  • tar и if-statement
  • Bash script arg0 уязвимость?
  • Может запускать службу С помощью скрипта init.d, однако запуск службы <SERVICE_NAME> не работает
  • «Interact» работает не так, как ожидалось, в сценариях bash / expect
  • Как я могу удалить все файлы в папку, к которой не было доступа за определенное время?
  • Linux и Unix - лучшая ОС в мире.