Entrada menos específica para script

1

Algum tempo atrás, enquanto eu estava procurando uma maneira de descobrir o que eu posso excluir do meu Android rom sem funções incapacitantes eu uso, eu encontrei deptree sobre o xda forums . Desde que isso foi escrito em 2012, não funcionaria como pretendido. Atualizando ferramentas usadas ( dex2jar , smali , ... ) além de algumas pequenas alterações nos scripts (como alterar pastas para as usadas em Android agora, por exemplo system/app-private to system/priv-app/*/ ) ei conseguiu de novo.
Parte da mágica acontece em três scripts que são semelhantes a este:

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

Através do uso de meus superpoderes de nunca ter aprendido a programar, concluí que as coisas acontecem aqui (você pode me corrigir se tiver algo errado):

  1. ao acessar a pasta de entrada $1 ,
  2. todos os arquivos bin(ary) são
  3. verificado se realmente é um arquivo binary , se sim,
    (não tenho ideia do que representa o || )
  4. verifica a extensão ( .so ou none ) e
  5. usa o arquivo (s) encontrado ( *.so e os sem extensão) como entrada para o script parse_bin.pl

A pasta de entrada precisa ser super específica, já que para esse script eles são

$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

O que eu gostaria de saber, como eu teria que modificar esses três scripts para que a pasta de entrada fosse $ACTIVE_DB/rom/system ?

EDIT: O mecanismo de encontrar o (s) arquivo (s) na (s) pasta (s) de entrada é o mesmo nos três scripts, exceto que os outros dois estão procurando por *.jar e *.apk

EDIT2: O shell bash é usado para executar este

Eu sei que isso tem que acontecer em algum lugar nas duas primeiras linhas do script, eu já tentei a resposta fromnaboo s de aqui que cuspiria todos os binários dentro da pasta $ACTIVE_DB/rom , mas não os passaria como entrada para parse_bin.pl .

Por favor, tenha um log:

+ 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 '' ']'
    
por chris 28.02.2016 / 12:47

2 respostas

2
Em primeiro lugar, sua suposição de que o script parece correto. Ele olha para todos os arquivos, pastas, links simbólicos etc que encontra em $1 , se for um arquivo, então detalha mais para determinar se é uma biblioteca ou um executável.

No shell script $1 é o primeiro argumento passado para o script, portanto, para executar este script com $ACTIVE_DB/rom/system na posição de $1 , você simplesmente invocaria o script com

./scriptname $ACTIVE_DB/rom/system

Nota: Se você estiver chamando isto de um prompt de comando $ACTIVE terá que ser substituído pelo caminho real.

Para fazer esse script descer recursivamente em seu diretório de destino, você pode tentar adicionar isso ao seu script

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
        # ....
    
por 28.02.2016 / 13:17
0

Então, no caso de alguém se perguntar o que eu fiz, aqui está o código a partir de agora.
Obrigado @the_velour_fog por me ajudar.
Se alguém acha que esta é a pior solução possível
(Eu não acho que seja super sexy também, mas faz o que tem que fazer), pegue-os aqui.

    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

Tanto quanto eu posso ver por enquanto, isso funciona, mas eu não tenho muita certeza sobre essa parte no final

     *)
            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

O futuro mostrará ^^

    
por 28.02.2016 / 14:45